UVa10048 Audiophobia (Floyd)

链接:http://bak3.vjudge.net/problem/UVA-10048

分析:把Floyd算法里的加法改成max。因为不管是floyd算法还是dijkstra算法,都是基于这样一个事实:对于任意一条至少包含两条边的路径i->j,一定存在一个中间点k,使得i->j的总长度等于i->k与k->j的长度之和。对于不同的点k,i->k和k->j的长度之和可能不同,最后还需要取一个最小值才是i->j的最短路径。把刚才推理中“之和”换成“取最大值”,推理仍然适用。

 1 #include <cstdio>
 2 #include <algorithm>
 3 using namespace std;
 4
 5 const int maxn = 100 + 5;
 6 const int INF = 1000000000;
 7 int c, s, q, d[maxn][maxn];
 8
 9 int main() {
10     int u, v, w, kase = 0;
11     while (scanf("%d%d%d", &c, &s, &q) == 3 && (c || s || q)) {
12         for (int i = 0; i < c; i++) {
13             d[i][i] = 0;
14             for (int j = i + 1; j < c; j++)
15                 d[i][j] = d[j][i] = INF;
16         }
17         for (int i = 0; i < s; i++) {
18             scanf("%d%d%d", &u, &v, &w); u--; v--;
19             d[u][v] = min(d[u][v], w);
20             d[v][u] = d[u][v];
21         }
22         for (int k = 0; k < c; k++)
23             for (int i = 0; i < c; i++)
24                 for (int j = 0; j < c; j++)
25                         d[i][j] = min(d[i][j], max(d[i][k], d[k][j]));
26         if (kase) printf("\n");
27         printf("Case #%d\n", ++kase);
28         while (q--) {
29             scanf("%d%d", &u, &v); u--; v--;
30             if (d[u][v] >= INF) printf("no path\n"); else printf("%d\n", d[u][v]);
31         }
32     }
33     return 0;
34 }
时间: 2024-11-16 14:05:49

UVa10048 Audiophobia (Floyd)的相关文章

UVA10048 - Audiophobia(Floyd,最大值的最小化)

UVA10048 - Audiophobia(Floyd,最大值的最小化) UVA10048 - Audiophobia 题目大意:给定一无向图,每条边都有一个权值,现在给你起点和终点,要求你找出起点到终点途经的边的最大值,要求这个值尽量小,到不了输出no path. 解题思路:在floyd过程中,就可以记录下来.G[i][j] = min(G[i][j], max(G[i][k], G[k][j])); 代码: #include <cstdio> const int maxn = 105;

uvs 10048 Audiophobia floyd的变形

#include <cstdio> #include <iostream> #include <algorithm> #include <queue> #include <stack> #include <cstdlib> #include <cmath> #include <set> #include <map> #include <vector> #include <cstri

UVAOJ 10048 - Audiophobia Floyd

链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=989 题意&题解: 紫书P365 代码: 31 int c, s, q; 32 int d[MAXN][MAXN]; 33 34 int main() { 35 ios::sync_with_stdio(false), cin.tie(0); 36 int cas = 1;

Uvaoj 10048 - Audiophobia(Floyd算法变形)

1 /* 2 题目大意: 3 从一个点到达另一个点有多条路径,求这多条路经中最大噪音值的最小值! . 4 5 思路:最多有100个点,然后又是多次查询,想都不用想,Floyd算法走起! 6 */ 7 #include<iostream> 8 #include<cstring> 9 #include<cstdio> 10 #define INF 0x3f3f3f3f 11 using namespace std; 12 13 int map[105][105]; 14 1

UVA 10048 Audiophobia 【floyd】

题目链接: https://vjudge.net/problem/UVA-10048 中文大意: 现在有一个无向图,有C个点,S个边,Q个询问. 每条边有一个权值代表噪音值.若想从u走到v.选择一条最大噪音尽可能小的路线. 对于每一个询问,输出u到v的路径中,输出路线的最大噪音值是多少. 大致思路: 整体的思路还是floyd,只不过中间的转移方程需要变一下. 原始的floyd是求最短路,更新的时候是当有更短的路径存在. 而在本题中,有更新的条件是发现某个路径上噪音最大值小于当前存储的值时,更新此

UVA - 10048 Audiophobia (Floyd应用)

题意:求出两点之间所有路径最大权值的最小值. 思路:转变一下Floyd的形式即可: 注意:注意初始化问题,还有UVA奇葩的输出形式. 代码如下: #include<iostream> #include<cstdio> #include<cstring> #include<string> #include<map> using namespace std; #define inf 0x3f3f3f int dp[110][110]; int mai

UVa 10048 (Floyd变形) Audiophobia

题意: 给一个带权无向图,和一些询问,每次询问两个点之间最大权的最小路径. 分析: 紫书上的题解是错误的,应该是把原算法中的加号变成max即可.但推理过程还是类似的,如果理解了Floyd算法的话,这个应该也很容易理解. 1 #include <cstdio> 2 #include <algorithm> 3 using namespace std; 4 5 const int maxn = 100 + 10; 6 const int INF = 1000000000; 7 int

10048 - Audiophobia (Floyd)

该题是Floyd算法的一个巧妙变形,虽然AC率很高,但是真正要灵活变化到做出该题,显然要明白Floyd算法的思想和原理 ,弄清楚为什么可以这样更改算法的核心部分. Floyd算法其实利用了动态规划的思想,适合求解结点不是很多的稠密图 . 我们都知道,动态规划在利用循环嵌套求解时是要规定一个次序的,这样才能将状态成功的转移 .该题的次序就是由k来定义的,从小到大枚举k,定义其意义为i和j之间一点. 那么对于每一个i和j以及每一个k,最优状态就的状态转移方程d[i][j] = min(d[i][j]

uva 10048 - Audiophobia(floyd 的变形)

给出一个无向连通图以及边权,目的求从一个点到另一个点的路径中 边权最大值 最小的那条路径,输出的是该条路径的最大边权. 因为是两点间路径问题,且数据量很小(只有100个) ,所以考虑使用floyd算法. 但是要求的并不是传统 floyd 所求的 两点之间最短路 问题,但是通过理解floyd算法的原理,可以发现floyd的思想可以用来解决这种问题: 对于任何一条至少包含两条边的路径i->j,一定存在一个中间点k,使得i->j的总长度等于i->k与k->j的长度之和.因为路径可能有多个