#include <stdio.h>
#include <stdlib.h>
int M = 99999999;
int map[1002][1002];
int mapt[1002][1002]; // map transposed
int d[1002];
int dt[1002];
void Dijkstra(int v, int d[], int graph[][1002], int n);
int main()
{
int n, edge, party;
int i, j, u, v, cost;
int max;
scanf("%d %d %d", &n, &edge, &party);
for(i=1; i<=n; i++)
for(j=1; j<=n; j++)
{
map[i][j] = M;
mapt[i][j] = M;
}
for(i=1; i<=edge; i++)
{
scanf("%d %d %d", &u, &v, &cost);
map[u][v] = cost;
mapt[v][u] = cost;
}
Dijkstra(party, d, map, n);
Dijkstra(party, dt, mapt, n);
max = 0;
for(i=1; i<=n; i++)
{
if(d[i]+dt[i] > max)
max = d[i]+dt[i];
}
printf("%d", max);
system("pause");
return 0;
}
// v:source, d:distance, n:number of node
// Refer Introduction to algorithm
void Dijkstra(int v, int d[], int graph[][1002], int n)
{
int i, j;
int ss[1002]; // The Set S
int min; // for implement min heap
int u;
// Initialize single source
for (i=1; i<=n; i++)
{
d[i] = M;
ss[i] = 0;
}
d[v] = 0;
for (i=1; i<=n; i++) // ensure run n times, actually n-1 times
{
// Get the d[min] from V-S=Q
min = M;
for (j=1; j<=n; j++)
{
if( (ss[j]==0) && (d[j]<min) )
{
min = d[j];
u = j;
}
}
ss[u] = 1; // Put u into Set S
// Relaxation
for (j=1; j<=n; j++)
{
if( d[u] + graph[u][j] < d[j] )
d[j] = d[u] + graph[u][j];
}
}
}
参考:http://blog.sina.com.cn/s/blog_7b5b66e70100ttg3.html http://blog.csdn.net/allenjy123/article/details/6003761