Heavy Transportation
这题求:1到n的路径中,边权最小的定义是min,求出min的最大值)
1 #include<iostream> 2 #include<algorithm> 3 #include<cstring> 4 #include<cmath> 5 #include<cstdio> 6 using namespace std; 7 8 const int INF=0x3f3f3f3f; 9 int n,m; 10 int e[1005][1005]; 11 12 int dijkstra() 13 { 14 int book[1005]; 15 int wei[1005]; 16 for(int i=1;i<=n;i++) 17 { 18 wei[i]=e[1][i]; 19 book[i]=0; 20 } 21 book[1]=1; 22 wei[1]=0; //................ 23 24 int u; 25 for(int i=2;i<=n;i++) 26 { 27 int temp=0; 28 for(int j=1;j<=n;j++) 29 { 30 if(!book[j] && wei[j]>temp) 31 { 32 u=j; 33 temp= wei[j]; 34 } 35 } 36 book[u]=1; 37 38 for(int j=1;j<=n;j++) 39 { 40 if(!book[j] && wei[j]< min( e[j][u], wei[u]) ) 41 wei[j]= min( e[j][u], wei[u]); 42 //更新,因为wei是储存1到每一个点的能通过的最大的重量 43 //所以要更新 使 j从1-n的 wei[j]比 “wei[u]和它下一段的e[u][j]其中一段的最小值 ” 的大, 44 } 45 } 46 return wei[n]; 47 48 } 49 int main() 50 { 51 int cas=0; 52 int a,b,w; 53 int T; 54 scanf("%d",&T); 55 for(int i=1;i<=T;i++) 56 { 57 memset(e,0,sizeof(e)); 58 scanf("%d%d",&n,&m); 59 for(int i=1;i<=m;i++) 60 { 61 scanf("%d%d%d",&a,&b,&w); 62 if( w >e[a][b]) 63 e[a][b]=e[b][a]=w; 64 } 65 printf("Scenario #%d:\n%d\n\n",++cas,dijkstra()); 66 } 67 }