[POJ1797] Heavy Transportation(最大生成树 || 最短路变形)

传送门

 

1.最大生成树

  可以求出最大生成树,其中权值最小的边即为答案。

 

2.最短路

  只需改变spfa里面的松弛操作就可以求出答案。

 

——代码

 1 #include <queue>
 2 #include <cstdio>
 3 #include <cstring>
 4 
 5 using namespace std;
 6 
 7 const int MAXN = 1005;
 8 int T, n, m, cnt;
 9 int head[MAXN], next[MAXN * MAXN], to[MAXN * MAXN], val[MAXN * MAXN], dis[MAXN];
10 bool vis[MAXN];
11 queue <int> q;
12 
13 inline void add(int x, int y, int z)
14 {
15     to[cnt] = y;
16     val[cnt] = z;
17     next[cnt] = head[x];
18     head[x] = cnt++;
19 }
20 
21 inline void spfa(int u)
22 {
23     int i, v;
24     memset(dis, 0, sizeof(dis));
25     memset(vis, 0, sizeof(vis));
26     while(!q.empty()) q.pop();
27     q.push(u);
28     vis[u] = 1;
29     dis[u] = 0x3f3f3f3f;
30     while(!q.empty())
31     {
32         u = q.front();
33         q.pop();
34         vis[u] = 0;
35         for(i = head[u]; i != -1; i = next[i])
36         {
37             v = to[i];
38             if(min(dis[u], val[i]) > dis[v])
39             {
40                 dis[v] = min(dis[u], val[i]);
41                 if(!vis[v])
42                 {
43                     q.push(v);
44                     vis[v] = 1;
45                 }
46             }
47         }
48     }
49 }
50 
51 int main()
52 {
53     int i, j, x, y ,z;
54     scanf("%d", &T);
55     for(i = 1; i <= T; i++)
56     {
57         scanf("%d %d", &n, &m);
58         cnt = 0;
59         memset(head, -1, sizeof(head));
60         for(j = 1; j <= m; j++)
61         {
62             scanf("%d %d %d", &x, &y, &z);
63             add(x, y, z);
64             add(y, x, z);
65         }
66         spfa(1);
67         printf("Scenario #%d:\n", i);
68         printf("%d\n\n", dis[n]);
69     }
70     return 0;
71 }
View Code

 

posted @ 2017-05-05 10:45  zht467  阅读(150)  评论(0编辑  收藏  举报