POJ 1125(dijkstra)

来源:互联网 发布:it培训评价网 编辑:程序博客网 时间:2024/05/21 17:27
/*思路 : 先将数据转成邻接矩阵, 再用最短路径的算法,依次求出每个点到全部点的距离,返回传输到所有点的所要时间,输出那个点所要时间最小的数据,即可; */#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;}

原创粉丝点击