light1002:传送门
【题目大意】
n个点m条边,给一个源点,找出源点到其他点的‘最短路’
定义:找出每条通路中最大的cost,这些最大的cost中找出一个最小的即为‘最短路’,dijkstra变形。dis[i]为s->i的‘最短路’
1 #include<bits/stdc++.h> 2 int mp[505][505],dis[505],vis[505]; 3 using namespace std; 4 int n; 5 void dij(int s) 6 { 7 int i,j,k; 8 for(i=0; i<n; i++) 9 { 10 dis[i]=mp[s][i]; 11 vis[i]=0; 12 } 13 vis[s]=1; 14 for(j=1; j<n; j++) 15 { 16 int min1=1e9; 17 for(i=0; i<n; i++) 18 { 19 if(min1>dis[i]&&!vis[i]) 20 { 21 min1=dis[i]; 22 k=i; 23 } 24 } 25 vis[k]=1; 26 for(i=0; i<n; i++) 27 { 28 if(!vis[i]&&mp[k][i]<1e9) 29 { 30 dis[i]=min(dis[i],max(dis[k],mp[k][i])); 31 } 32 } 33 } 34 } 35 int main() 36 { 37 int t,u,v,w,i,j; 38 cin>>t; 39 for(int co=1; co<=t; co++) 40 { 41 int m; 42 scanf("%d%d",&n,&m); 43 for(i=0; i<n; i++) 44 for(j=0; j<n; j++) 45 { 46 if(i==j) 47 mp[i][j]=0; 48 else 49 mp[i][j]=1e9; 50 } 51 while(m--) 52 { 53 scanf("%d%d%d",&u,&v,&w); 54 if(mp[u][v]>w) 55 mp[u][v]=mp[v][u]=w; 56 } 57 int s; 58 cin>>s; 59 dij(s); 60 printf("Case %d:\n",co); 61 for(i=0; i<n; i++) 62 { 63 if(dis[i]==1e9) 64 puts("Impossible"); 65 else 66 printf("%d\n",dis[i]); 67 } 68 } 69 return 0; 70 }