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

  

posted @ 2020-02-18 18:33  雾里尘埃  阅读(155)  评论(0编辑  收藏  举报