1. 程式人生 > >【lightoj-1002】Country Roads(dijkstra變形)

【lightoj-1002】Country Roads(dijkstra變形)

cost pan body i++ urn ++ volume oss 最短

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 }

【lightoj-1002】Country Roads(dijkstra變形)