POJ1125 - Stockbroker Grapevine - 最短路dijkstra/floyd
阿新 • • 發佈:2020-09-17
題意
給出多組資料,
每組資料給出一個n,表示接下來又n行
每行給出一個x,表示後面跟著x對資料(y、z),
代表第i行到y的時間為z。
問從第幾號開始傳所需的時間最少,
輸出編號和最短時間。
思路
可以用Floyd寫,我用的是dijkstra寫。
for迴圈遍歷每個dijkstra即可。
注意
C++會過,G++會WA,不知道為啥子
AC程式碼
#include<iostream> #include<string.h> #include<algorithm> #include<stdio.h> #include<cmath> #include<list> #include<stdlib.h> #include<stack> #include<stdio.h> #include<queue> using namespace std; typedef long long ll; #define sc(T) scanf("%d",&T) #define scc(x,y) scanf("%d %d",&x,&y) #define pr(T) printf("%d\n",T) #define f(a,b,c) for (int a=b;a<=c;a++) #define ff(a,b,c) for (int a=b;a>=c;a--) #define inf 0x3f3f3f3f #define mem(a,b) memset(a,b,sizeof(a)) #define eps 1e-9 #define PI acos(-1) int n,a[110][110],dis[110],ans[110]; bool book[110]; void dijkstra(int x) { mem(book,0); for(int i=1; i<=n; i++) dis[i]=a[x][i]; book[x]=1; // dis[x]=0;可寫可不寫 int k; for(int i=; i<=n; i++) { int mi=inf; for(int j=1; j<=n; j++) { if(!book[j]&&dis[j]<mi) mi=dis[j],k=j; } // if(k==0) //可寫可不寫 // return; //沒有可直接到達的點 book[k]=1; for(int j=1; j<=n; j++) { // != if(a[k][j]<inf&&dis[j]>dis[k]+a[k][j]) dis[j]=dis[k]+a[k][j]; } } // int p=0; // for(int i=1; i<=n; i++) // p+=dis[i]; // ans[x]=p; } int main() { while(~scanf("%d",&n)&&n) //n個人 { for(int i=1; i<=n; i++) //一定要寫! { for(int j=1; j<=n; j++) { if(i==j) a[i][j]=0; else a[i][j]=inf; } } // mem(a,0); for(int i=1; i<=n; i++) { int x; sc(x); for(int j=1; j<=x; j++) { int xx,yy; scc(xx,yy); a[i][xx]=min(a[i][xx],yy); // 傻不拉幾的我,這裡竟然錯了!!! } } // 求從第幾號開始傳 所需的時間最少 求出這個最短時間 // for(int i=1; i<=n; i++) // dijkstra(i); // int k,kk,c=inf,flag=0; // for(int i=1; i<=n; i++) // { // if(ans[i]>=inf) // { // flag=1; // break; // } // if(ans[i]<c) // c=ans[i],k=i; // } int ma=-inf,mi=inf,k=1; for(int i=1; i<=n; i++) { ma=-inf; dijkstra(i); for(int j=1; j<=n; j++) ma=max(ma,dis[j]); if(ma<mi) k=i,mi=ma; } if(mi==inf) printf("disjoint\n"); else cout<<k<<" "<<mi<<endl; } return 0; }