Commandos (UVA-11463)

题目大意:

        一组敢死队要炸掉所给的所有建筑,题目首先给出一个w代表测试数据个数,然后分别给出n、m代表建筑物个数和建筑物之间关系的个数,后边m行给出两个建筑物代号(0~ n-1)代表他们中间有一条路,最后数据给出一个start一个end,敢死队要从start走到end集合,敢死队人数无限,问最后一个人到的时候多长时间了(到一个建筑物时间就 过了一个单位)。

解题思路:

      又是一道Floyd的题,map[103][103]存储所有建筑物之间的关系,五行打表,for循环遍历每一个建筑物,看看从start到第i个建筑物,再从第i个建筑物到end所需的时间,时间最长的那个就是结果。

代码如下:

#include<stdio.h>
#define INF 0x3f3f3f3f
int map[103][103];
int start,end,a,b,n,m,w;
void input();
void floyd();
int main()
{
	int w;
	scanf("%d",&w);
	for(int i=1 ; i<=w ; i++)
	{
		input();
		printf("Case %d: ",i);
		floyd();
	}
	return 0;
}
void floyd()
{
	for(int k=0 ; k<n ; k++)
		for(int i=0 ; i<n ; i++)
			for(int j=0 ; j<n ; j++)
				if(map[i][k]<INF && map[k][j]<INF && map[i][k]+map[k][j]<map[i][j])
					map[i][j] = map[i][k] + map[k][j];
	int max = 0;
	for(int i=0 ; i<n ; i++)
		if(max<map[start][i] + map[end][i])
			max=map[start][i] + map[end][i];
	printf("%d\n",max);
}
void input()
{
	scanf("%d%d",&n,&m);
	for(int i=0 ; i<n ; i++)
		for(int j=0 ; j<n ; j++)
			if(i==j)map[i][j]=0;
			else map[i][j] = INF;
	while(m--)
	{
		scanf("%d%d",&a,&b);
		map[a][b] = 1;
		map[b][a] = 1;
	}
	scanf("%d%d",&start,&end);
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值