zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    C++primer习题3.13
    Indesign技巧
    《转载》虚函数在对象中的内存布局
    C++new失败后如何处理
    sizeof的用法
    转载 C++中虚继承防止二义性
    字符串反转
    回文写法
    C++术语
    QT+VS2008
  • 原文地址:https://www.cnblogs.com/zyb993963526/p/6389117.html
Copyright © 2011-2022 走看看