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; }