UVa 10048 噪音恐惧症(Floyd)

传送门

题意

输入一个C个点S条边的无向带权图,边权表示该路径上的噪声值。输入一些询问,每次询问两个点,输出这两点间最大噪声值最小的路径。

思路

最简单的方法就是Floyd算法。本来是求长度的,现在求最大噪声值最小的路径,稍微改一下就好了。

d[i][j]=min(d[i][j],max(d[i][k],d[k][j]))

其次,也可以用Dijkstra算法来计算。

代码

 1 #include<iostream> 
 2 #include<cstring>
 3 #include<string>
 4 #include<algorithm>
 5 #include<vector>
 6 using namespace std;
 7 
 8 #define INF 1000001
 9 
10 int n, m, t;
11 int s, e;
12 
13 int map[105][105];
14 
15 
16 int main()
17 {
18     //freopen("D:\txt.txt", "r", stdin);
19     int kase = 1;
20     int a, b, w;
21     while (scanf("%d%d%d", &n, &m,&t))
22     {
23         if (m == 0 && n == 0 && t == 0)  break;
24         if (kase > 1)   printf("
");
25         printf("Case #%d
", kase++);
26 
27         for (int i = 1; i <= n; i++)
28         {
29             map[i][i] = INF;
30             for (int j = i + 1; j <= n; j++)
31                 map[i][j] = map[j][i] = INF;
32         }
33 
34         
35         for (int i = 0; i < m; i++)
36         {
37             scanf("%d%d%d", &a, &b, &w);
38             map[a][b] = map[b][a] = w;
39         }
40 
41         for (int k = 1; k <= n;k++)
42         for (int i = 1; i <= n;i++)
43         for (int j = 1; j <= n; j++)
44             map[i][j] = min(map[i][j], max(map[i][k], map[k][j]));
45 
46         for (int i = 0; i < t; i++)
47         {
48             scanf("%d%d", &s, &e);
49             if (map[s][e] == INF)   printf("no path
");
50             else  printf("%d
", map[s][e]);
51         }
52     }
53     return 0;
54 }
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<vector>
 4 #include<cstring>
 5 #include<queue>
 6 using namespace std;
 7 const int inf = 0x3f3f3f3f;
 8 typedef pair<int, int> pii;
 9 
10 int c, s, q;
11 vector<pii> g[105];
12 bool vis[105];
13 int d[105][105];
14 
15 struct HeapNode{
16     int d, u;
17     bool operator < (const HeapNode& rhs) const{
18         return d > rhs.d;
19     }
20 };
21 
22 
23 void dijkstra(int s){
24     memset(vis, 0, sizeof(vis));
25     for(int i=1; i<=c; i++)  d[s][i] = inf;
26     d[s][s] = 0;
27     priority_queue<HeapNode> Q;
28     Q.push((HeapNode){0, s});
29     while(!Q.empty()){
30         HeapNode x = Q.top(); Q.pop();
31         int u = x.u;
32         if(vis[u])  continue;
33         vis[u] = true;
34         for(int i=0; i<g[u].size(); i++){
35             int v = g[u][i].first;
36             if(d[s][v] > max(d[s][u], g[u][i].second)){
37                 d[s][v] = max(d[s][u], g[u][i].second);
38                 Q.push((HeapNode){d[s][v], v});
39             }
40         }
41     }
42 }
43 
44 int main(){
45     //freopen("in.txt", "r", stdin);
46     int cas = 1;
47     while(~scanf("%d%d%d", &c, &s, &q) && c && s && q){
48         for(int i=1; i<=c; i++)  g[i].clear();
49         if(cas > 1)  puts("");
50         printf("Case #%d
", cas++);
51         for(int i=0; i<s; i++){
52             int u, v, w;
53             scanf("%d%d%d", &u, &v, &w);
54             g[u].push_back(make_pair(v, w));
55             g[v].push_back(make_pair(u, w));
56         }
57         for(int i=1; i<=c; i++){
58             dijkstra(i);
59         }
60 
61         while(q--){
62             int st, ed;
63             scanf("%d%d", &st, &ed);
64             if(d[st][ed] == inf)  puts("no path");
65             else printf("%d
", d[st][ed]);
66         }
67     }
68     return 0;
69 }
原文地址:https://www.cnblogs.com/zyb993963526/p/6389117.html