#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <limits.h>
#include <memory.h>
#define MAX 1010
#define INF 10000
int n;
int data[MAX][MAX];
int cal[MAX];
int used[MAX];
int lowcost[MAX];
int dijkstra( int start )
{
memset(used, 0, sizeof(used) );
int max = 0, choose, temp, i, j;
for( i = 1; i <= n; i++ )
lowcost[i] = data[start][i];
lowcost[start] = 0;
used[start] = 1;
for( i = 1; i <= n-1; i++ )
{
temp = INF;
for( j = 1; j <= n; j++ )
{
if( !used[j] && lowcost[j] <= temp )
temp = lowcost[choose=j];
}
used[choose] = 1;
for( j = 1; j <= n; j++ )
{
if( !used[j] && lowcost[choose] + data[choose][j] < lowcost[j] )
lowcost[j] = lowcost[choose] + data[choose][j];
}
}
for( j = 1; j <= n; j++ )
{
if( lowcost[j] > max )
max = lowcost[j];
}
return max;
}
int main()
{
int flag, m, min, t, time, x, i, j;
while( scanf( "%d", &n ) && n )
{
for( i = 1; i <= n; i++ )
for( j = 1; j <= n; j++ )
data[i][j] = INF;
for( i = 1; i <= n; i++ )
{
scanf( "%d", &t );
while( t-- )
{
scanf( "%d%d", &x, &time );
data[i][x] = time;
}
}
for( i = 1; i <= n; i++ )
cal[i] = dijkstra( i );
min = 999999;
flag = 0;
for( i = 1; i <= n; i++ )
{
if( cal[i] < min )
{
min = cal[i];
m = i;
}
if( cal[i] != INF )
flag = 1;
}
if( flag )
{
printf( "%d %d\n", m, min );
}
else
printf( "disjoint\n" );
}
return 0;
}
ZOJ 1082 dijkstra 最短路径
最新推荐文章于 2022-02-07 15:29:59 发布