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

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 }

 

posted @ 2018-02-10 01:11  LesRoad  阅读(282)  评论(0编辑  收藏  举报