/*
思路 : 先将数据转成邻接矩阵, 再用最短路径的算法,依次求出每个点到全部点的距离,返回传输到所有点的所要时间,输出那个点所要时间最小的数据,即可;
*/
#include <iostream>
#include <cstring>
using namespace std;
const int INF = 1<<30;
const int MAX = 105;
int map[MAX][MAX];
int dis[MAX];
int sign[MAX];
int res;
//初始化邻接矩阵
void init(int count){
for(int i=1; i<=count; ++i){
for(int j=1; j<=count; ++j){
if(i==j){
map[i][j] = 0;
}else{
map[i][j] = INF;
}
}
}
}
//可以用floyd算法
int dijkstra(int start,int count){
memset(sign, 0, sizeof(sign));
memset(dis, 0, sizeof(dis));
int max=0,min,temp;
for(int i=1; i<=count; ++i){
dis[i] = map[start][i];
}
sign[start] = 1;
for(int i=1; i<=count; ++i){
min = INF;
for(int j=1; j<=count; ++j){
if(!(sign[j]) && min>dis[j]){
min = dis[j];
temp = j;
}
}
sign[temp] = 1;
for(int j=1; j<=count; ++j){
if(!(sign[j]) && dis[j] > dis[temp] + map[temp][j]){
dis[j] = dis[temp] + map[temp][j];
}
}
}
for(int i=1; i<=count; ++i){
if(max < dis[i]){
max = dis[i];
}
}
return max;
}
int main(){
int count,y,minutes,path;
while(1){
scanf("%d",&count);
if(count == 0) break;
init(count);
for(int i=1; i<=count; ++i){
scanf("%d",&path);
while(path--){
scanf("%d %d",&y, &minutes);
map[i][y] = minutes;
}
}
res = INF;
int location;
for(int i=1; i<=count; ++i){
int temp = dijkstra(i,count);
if(res > temp){
res = temp;
location = i;
}
}
//如果有点被孤立,输出disjoint
if(res == INF) {
continue;
printf("disjoint\n");
}
printf("%d %d\n",location, res);
}
return 0;
}
POJ 1125(dijkstra)
最新推荐文章于 2018-07-15 11:24:42 发布