题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1174
题意:很多人从起点出发走过所有城市后,在终点汇聚所需的最短时间。
利用floyd。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <string>
#include <queue>
using namespace std;
const int inf = 10000000;
int t;
int p[110][110];
int n, m;
void init(int n)
{
for (int i = 0; i <= n; i++)
{
p[i][i] = 0;
for (int j = i + 1; j <= n; j++)
p[i][j] = p[j][i] = inf;
}
}
void floyd(int n)
{
for (int k = 0; k < n; k++)
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
{
if (p[i][k] + p[k][j] < p[i][j] && p[i][k]!=inf && p[k][j] !=inf)
p[i][j] = p[i][k] + p[k][j];
}
}
int main()
{
scanf("%d",&t);
int a, b, c;
for (int k = 1; k <= t; k++)
{
scanf("%d%d", &n, &m);
init(n);
while (m--)
{
scanf("%d%d",&a,&b);
p[a][b] = p[b][a] = 1;
}
floyd(n);
int s, e;
scanf("%d%d",&s,&e);
int ans = -inf;
for (int i = 0; i < n; i++)
{
if (p[s][i] != inf && p[i][e] != inf)
ans = max(ans,p[s][i] + p[i][e]);
}
printf("Case %d: %d\n", k, ans);
}
return 0;
}