UVA - 10048 Audiophobia
题意:有c(c <= 100)个点, s(s <= 1000)条边, q(q <= 10000)个询问,对于每个询问,输出两点路径的最小边,若没有该路径,输出"no path"
原题链接:https://vjudge.net/problem/UVA-10048
这个就是弗洛伊德的一个变种,最短路改成了最小边而已,容易推算出ans[i][j] = min(ans[i][j], max(ans[i][k], ans[k][j]))。弗洛伊德对着来一套即可。
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int Maxc = 1e3 + 10;
const int inf = 0x3f3f3f3f;
int ans[Maxc][Maxc];
void Ini()
{
memset(ans, inf, sizeof(ans));
}
void Input(int c, int s, int q)
{
for (int i = 1; i <= s; i++) {
int u, v, w;
cin >> u >> v >> w;
ans[u][v] = w;
ans[v][u] = w;
}
}
void solve(int c, int s, int q, int Case)
{
cout << "Case #" << Case << endl;
for (int i = 1; i <= c; i++)
ans[i][i] = 0;
for (int k = 1; k <= c; k++)
for (int i = 1; i <= c; i++)
for (int j = 1; j <= c; j++)
ans[i][j] = min(ans[i][j], max(ans[i][k], ans[k][j]));
for (int i = 1; i <= q; i++) {
int u, v;
cin >> u >> v;
if (ans[u][v] >= inf) cout << "no path" << endl;
else cout << ans[u][v] << endl;
}
}
int main()
{
int c, s, q;
int Case = 0;
bool first = true;
while (cin >> c >> s >> q && c) {
if (first) first = false;
else cout << endl;
Ini();
Input(c, s, q);
solve(c, s, q, ++Case);
}
return 0;
}

浙公网安备 33010602011771号