using
System;
using
System.Collections.Generic;
namespace
ConsoleApp1
{
class
Program
{
static
void
Main(
string
[] args)
{
int
N = 9, M = 14, A = 0, B = 2;
var
graph =
new
List<Tuple<
int
,
int
,
int
>>();
graph.Add(
new
Tuple<
int
,
int
,
int
>(0, 1, 4));
graph.Add(
new
Tuple<
int
,
int
,
int
>(1, 2, 8));
graph.Add(
new
Tuple<
int
,
int
,
int
>(2, 3, 7));
graph.Add(
new
Tuple<
int
,
int
,
int
>(3, 4, 9));
graph.Add(
new
Tuple<
int
,
int
,
int
>(4, 5, 10));
graph.Add(
new
Tuple<
int
,
int
,
int
>(5, 6, 2));
graph.Add(
new
Tuple<
int
,
int
,
int
>(6, 7, 1));
graph.Add(
new
Tuple<
int
,
int
,
int
>(7, 0, 8));
graph.Add(
new
Tuple<
int
,
int
,
int
>(1, 7, 11));
graph.Add(
new
Tuple<
int
,
int
,
int
>(7, 8, 7));
graph.Add(
new
Tuple<
int
,
int
,
int
>(2, 8, 2));
graph.Add(
new
Tuple<
int
,
int
,
int
>(6, 8, 6));
graph.Add(
new
Tuple<
int
,
int
,
int
>(2, 5, 4));
graph.Add(
new
Tuple<
int
,
int
,
int
>(3, 5, 14));
Console.WriteLine(ShortestDistance(graph, N, M, A, B));
Console.ReadLine();
}
private
static
int
ShortestDistance(List<Tuple<
int
,
int
,
int
>> graph,
int
N,
int
M,
int
A,
int
B)
{
var
distA = Dijkstras(graph, N, A);
var
distB = Dijkstras(graph, N, B);
int
ans = distA[B];
foreach
(
var
edge
in
graph)
{
int
u = edge.Item1;
int
v = edge.Item2;
int
weight = edge.Item3;
int
cur = Math.Min(distA[u] + distB[v], distA[v] + distB[u]) + (weight / 2);
ans = Math.Min(ans, cur);
}
return
ans;
}
private
static
int
[] Dijkstras(List<Tuple<
int
,
int
,
int
>> graph,
int
N,
int
src)
{
var
dis =
new
int
[N];
for
(
int
i=0; i<N; i++)
{
dis[i] = Int32.MaxValue;
}
var
vis =
new
bool
[N];
var
pq =
new
SortedSet<Tuple<
int
,
int
>>(Comparer<Tuple<
int
,
int
>>.Create((x, y) => x.Item1.CompareTo(y.Item1)));
pq.Add(
new
Tuple<
int
,
int
>(0, src));
dis[src] = 0;
while
(pq.Count > 0)
{
var
cur = pq.Min;
pq.Remove(cur);
int
node = cur.Item2;
int
weight = cur.Item1;
if
(vis[node])
continue
;
vis[node] =
true
;
foreach
(
var
child
in
graph)
{
if
(child.Item1 == node || child.Item2 == node)
{
int
adjNode = child.Item1 == node ? child.Item2 : child.Item1;
if
(dis[adjNode] > child.Item3 + weight)
{
dis[adjNode] = weight + child.Item3;
pq.Add(
new
Tuple<
int
,
int
>(dis[adjNode], adjNode));
}
}
}
}
return
dis;
}
}
}