题目描述
输入一个C 个点 S 条边的无向带权图,边权表示该路径上的噪声值。当噪声值太大时,耳膜可能会受到伤害,所以当你从某点去往另一个点时,总是希望路上经过的最大噪声值最小。输入一些询问,每次询问两个点,输出这两个点间「最大噪声值最小的路径」上,噪声值最大的一条边的噪声值。
如果两个点之间不连通,输出 "no path"。(不含引号)
输入描述
本题包含多组输入。
每组数据第一行含有 3 个整数:C,S,Q,分别表示点数、边数和询问数量。
接下来 S 行,每行三个整数 u,v,w,表示一条两端点为 u,v,噪声值为 w 的无向边。
之后的 Q 行,每行两个整数 a,b,询问从 a 到 b,「最大噪声值最小的路径」的「最大噪声值」。
(C≤100,S≤1000,Q≤10000 )
输出描述
每组数据输出的起始部分,输出一行数据编号 (从 1 开始计数)。
对每次询问,若两点连通,输出两点间「最大噪声值最小的路径」的「最大噪声值」。否则输出 "no path"。
详见样例。
样例输入
Copy to Clipboard
6 6 1 5 1 5 6 1 4 2 1 3 3 6 7 3 4 6 3 1 8 2 5 5 4 2 4 1 9 5 1 4 2 1 3 3 4 7 4 5 4 5
样例输出
Copy to Clipboard
Case #1 5 Case #2 9 9
/*
* @Description: To iterate is human, to recurse divine.
* @Autor: Recursion
* @Date: 2022-06-08 18:59:29
* @LastEditTime: 2022-06-08 20:47:14
*/
#include <bits/stdc++.h>
#define LL long long
using namespace std;
const int maxn = 1e6 + 10;
const int mod = 1e9 + 7;
const int INF = 1e9 + 10;
const int N = 1e3 + 7;
int a[N][N];
int C,S,Q;
int u,v,w;
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int count = 0;
while(cin >> C >> S >> Q){
count ++;
memset(a,0,sizeof(a));
for(int i = 1;i <= C;i ++)
for(int j = 1;j <= C;j ++)
if(i != j)
a[i][j] = INF;
while(S--){
cin >> u >> v >> w;
a[u][v] = w;
a[v][u] = w;
}
for(int k = 1;k <= C;k ++)
for(int i = 1;i <= C;i ++)
for(int j = 1;j <= C;j ++)
a[i][j] = min(a[i][j],max(a[i][k],a[k][j]));
cout << "Case #" << count << endl;
while(Q--){
int x,y;
cin >> x >> y;
if(a[x][y] == INF){
cout << "no path" << endl;
continue;
}
else
cout << a[x][y] << endl;
}
}
return 0;
}
该博客主要讨论如何解决寻找两点间噪声值最大但总体噪声值最小的路径问题。给出的算法题要求在无向带权图中,针对多个询问,找到每对点之间最大噪声值最小的路径上噪声值的最大值。如果两点不连通,则输出'no path'。题目描述了输入输出格式,并提供了样例输入和输出。
5038

被折叠的 条评论
为什么被折叠?



