KIDx的解题报告
?
题目链接:http://lightoj.com/volume_showproblem.php?problem=1174
?
题意:无限支军队从起点出发,最少要多长时间路过所有城市并且到达终点?
?
利用folyd 插点法的思想即可解决
?
找到dist[s][i] + dist[i][t]的最大值即为所求最小值
#include <iostream>
using namespace std;
#define M 105
#define inf 0x3fffffff
int dist[M][M], n;
void init ()
{
int i, j;
for (i = 0; i < n; i++)
{
dist[i][i] = 0;
for (j = i + 1; j < n; j++)
dist[i][j] = dist[j][i] = inf;
}
}
void floyd ()
{
int i, j, k;
for (k = 0; k < n; k++)
for (i = 0; i < n; i++)
for (j = 0; j < n; j++)
if (dist[i][k] != inf && dist[k][j] != inf &&
dist[i][k] + dist[k][j] < dist[i][j])
dist[i][j] = dist[i][k] + dist[k][j];
}
int main()
{
int t, cc = 1, q, a, b, s, e, ans, i;
scanf ("%d", &t);
while (t--)
{
scanf ("%d%d", &n, &q);
init();
while (q--)
{
scanf ("%d%d", &a, &b);
dist[a][b] = dist[b][a] = 1;
}
floyd ();
scanf ("%d%d", &s, &e);
ans = 0;
for (i = 0; i < n; i++)
{
if (dist[s][i] == inf || dist[i][e] == inf)
continue;
int tp = dist[s][i] + dist[i][e];
if (tp > ans)
ans = tp;
}
printf ("Case %d: %d\n", cc++, ans);
}
return 0;
}
?