您的位置:首页 > 运维架构

UVA - 10048 Audiophobia floyd的变形

2014-12-03 08:14 281 查看
题目大意:给出一张图,从起点走到终点,要求走的路程中路的权值的最大值达到最小

解题思路:floyd算法变形,设dp[i][j]为从i到j的权值的最大值的最小值,则dp[i][j] = min(dp[i][j],max(dp[i][k],dp[k][j])),dp[i][k]和dp[k][j]必须是连通的,这题相当于是DP题;}

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define maxn 1005
int dis[maxn][maxn],f[maxn][maxn];
int c,s,q;
int main() {
	int mark = 1, bo = 1;
	while(scanf("%d%d%d",&c,&s,&q) != EOF && c + s + q) {
		if(bo)
			bo = 0;
		else
			printf("\n");
		for(int i = 1; i <= c; i++)
			for(int j = 1; j <= c; j++)
				if(i == j)
					f[i][j] = 0;
				else
					f[i][j] = -1;
		int t1,t2,len;
		for(int i = 1; i <= s; i++) {
			scanf("%d%d%d",&t1,&t2,&len);	
			f[t1][t2] = f[t2][t1] = len;
		}

		for(int k = 1; k <= c; k++)
			for(int i = 1; i <= c; i++)
				for(int j = 1; j <= c; j++)
					if(f[i][k] != -1 && f[k][j] != -1) {
						int temp = max(f[i][k],f[k][j]);
						if( f[i][j] == -1 || f[i][j] > temp)
							f[i][j] = temp;
					}
		int start,end;
		printf("Case #%d\n",mark++);
		for(int i = 0; i < q; i++) {
			scanf("%d%d",&start,&end);
			if(f[start][end] == -1)
				printf("no path\n");
			else
				printf("%d\n",f[start][end]);
		}
	
	}
	return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: