這幾天的刷題速度是極慢的, 面對zoj的一堆螞蟻大小的英文題, 總覺得心煩氣躁, 剛吃晚飯,把WA的再來改改, 隨便一改, 對了, 因為我之前一題Floyed更新距離那一塊我順便做了雙向的更新 即反方向的也寫上去了, 沒錯, 不過這題, 我改之前錯的, 改之後意外的對了 於是附上代碼
//這題的思路 主要就是從枚舉每一個點 從任何一個點出發 看到達所有點所花的最短時間,才開始我想的有些複雜,認為無法在同一個時間傳遞給多人,//後來發現 不存在這個問題, 只要在每次運算找到最大的一個距離 , 然後在全域的枚舉中 找到一個最短的距離 就是結果了。基本都是套的模版沒有其他難度 #include<stdio.h>const int maxn=101;const int INF=1000000000;void Floyed(int n,int map[][maxn],int dist[][maxn],int pre[][maxn]){int i,j,k;for(i=1;i<=n;i++){for(j=1;j<=n;j++){dist[i][j]=map[i][j];pre[i][j]=i;}}for(k=1;k<=n;k++)for(i=1;i<=n;i++)for(j=1;j<=n;j++)if(dist[i][k]!=INF&&dist[k][j]!=INF&&dist[i][j]>dist[i][k]+dist[k][j]){dist[i][j]=dist[i][k]+dist[k][j];pre[i][j]=pre[k][j];}}int main(){int n,map[maxn][maxn],dist[maxn][maxn],pre[maxn][maxn];int t;int i,j,ti;while(scanf("%d",&n)&&n){for(i=1;i<=n;i++)for(j=1;j<=n;j++)if(i!=j) map[i][j]=INF;else map[i][j]=0;for(i=1;i<=n;i++){scanf("%d",&t);while(t--){scanf("%d%d",&j,&ti);map[i][j]=ti;}}if(n==1){printf("1 0\n");continue;}Floyed(n,map,dist,pre);int tmp=0;int tmpmin=INF;for(i=1;i<=n;i++){int tmpmax=-1;for(j=1;j<=n;j++){if(dist[i][j]>tmpmax){tmpmax=dist[i][j];}}if(tmpmax!=INF&&tmpmax<tmpmin){tmp=i;tmpmin=tmpmax;}}if(tmp)printf("%d %d\n",tmp,tmpmin);else printf("disjoint\n");}return 0;}