【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 }