找经过某些特定点的最小环,floyd一遍就完事了
#include<stdio.h>
#include<string.h>
#include<limits.h>
int main()
{
int n, m, c, hotel[100], map[101][101];
while (scanf("%d %d", &n, &c) != EOF)
{
int i, j, k, a, b, d;
for (i = 0; i < c; i++)
scanf("%d", &hotel[i]);
memset(map, 0, sizeof(map));
for (i = 1; i <= n; i++)
for (j = 1; j <= n; j++)
map[i][j] = i == j ? 0 : INT_MAX;
scanf("%d", &m);
while (m--)
{
scanf("%d %d %d", &a, &b, &d);
map[a][b] = d;
}
for (k = 1; k <= n; k++)
for (i = 1; i <= n; i++)
for (j = 1; j <= n; j++)
if (map[i][k] != INT_MAX && map[k][j] != INT_MAX
&& map[i][k] + map[k][j] < map[i][j])
map[i][j] = map[i][k] + map[k][j];
int res = 0, min = INT_MAX;
for (k = 0; k < c; k++)
{
i = hotel[k];
for (j = 1; j <= n; j++)
if (i != j && map[i][j] != INT_MAX && map[j][i] != INT_MAX
&& map[i][j] + map[j][i] < min)
{
min = map[i][j] + map[j][i];
res = i;
}
}
if (res)
printf("%d\n", res);
else
puts("I will nerver go to that city!");
}
return 0;
}