POJ 1125
来源:互联网 发布:大话西游3手游下载mac 编辑:程序博客网 时间:2024/05/17 01:50
//11099198c00h00g1125Accepted412K16MSG++1750B2012-12-11 16:08:05//dij函数用来返回最小值中的最大值 #include<stdio.h>#include<stdlib.h>#include<string.h>int d[105];int mat[105][105];int visited[105]; #define INF 999999999int n,m;//查找最短距离 int dij(int start){ memset(visited,0,sizeof(visited)); for(int i=0;i<n;i++) d[i]=mat[start][i]; visited[start]=1; for(int i=0;i<n-1;i++){ //查找最小的d值 int v=-1,min; min=INF; for(int j=0;j<n;j++){ if(visited[j]==0&&d[j]<min){ min=d[j]; v=j; } } //加上这一句就ac了,v周围可能没有元素 if(v==-1) break; visited[v]=1; //查找出来之后进行松弛操作 for(int j=0;j<n;j++){ if(visited[j]==0&&d[j]>d[v]+mat[v][j]){ d[j]=d[v]+mat[v][j]; } } } int min=-1; for(int i=0;i<n;i++){ if(d[i]>min) min=d[i]; } return min;}int main(){ while(scanf("%d",&n)!=EOF&&n){ for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ if(i!=j) mat[i][j]=INF; else mat[i][j]=0; } } for(int i=0;i<n;i++){ scanf("%d",&m); int node,time; for(int j=0;j<m;j++){ scanf("%d%d",&node,&time); node--; mat[i][node]=time; } } int res,ve; int min=INF; for(int i=0;i<n;i++){ res=dij(i); if(res<min){ min=res; ve=i; } } if(min==INF) printf("disjoint\n"); else printf("%d %d\n",ve+1,min); } return 0; }