题目大意:
一组敢死队要炸掉所给的所有建筑,题目首先给出一个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);
}