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

UVa 10048 - Audiophobia

2014-04-27 15:15 323 查看
题目:在一个城市里,每条道路上都有噪音,你要从A点走到B点,找出一条道路,使最大的噪音最小。

分析:最短路、最小生成树。当计算图中某条路径上的线段最大值最小类似的问题。

可以利用最小生成树或最短路算法。更新时取最值即可。

说明:由于本题查找较多,需要计算多元最值,所以采用floyd算法。

#include <stdio.h>
#include <stdlib.h>

#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))

int path[101][101];

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