单源最短路径,注意home和第一个路口要和mom说的一致,也就是说从第二点开始找到学校的最短路径。还有注意max要设的尽量大
#include<stdio.h>
#include<stdlib.h>
#define INT_MAX 0xFFFFFFF
int main()
{
int t, count;
scanf("%d", &t);
for (count = 1; count <= t; count++)
{
int n, m, i, j, a, b, c, k;
scanf("%d %d", &n, &m);
int **time = malloc(n * sizeof(int *));
for (i = 0; i < n; i++)
{
time[i] = malloc(n * sizeof(int));
for (j = 0; j < n; j++)
time[i][j] = 0;
}
while (m--)
{
scanf("%d %d %d", &a, &b, &c);
time[a - 1][b - 1] = time[b - 1][a - 1] = c;
}
scanf("%d", &k);
int prev = -1, curr, mom = 0, flag = 1;
int first, second;
for (i = 0; i < k; i++)
{
scanf("%d", &curr);
if (i == 0)
first = curr - 1;
if (i == 1)
second = curr - 1;
if (prev != -1)
{
if (!time[prev - 1][curr - 1])
flag = 0;
else
mom += time[prev - 1][curr - 1];
}
prev = curr;
}
if (!flag)
{
printf("TEST %d N\n", count);
continue;
}
int known[1000], d[1000];
for (i = 0; i < 1000; i++)
{
known[i] = 0;
d[i] = INT_MAX;
}
known[first] = 1;
d[first] = 0;
d[second] = time[first][second];
int now = second, nk = 1, next;
while (nk < n)
{
int mind = INT_MAX;
known[now] = 1;
nk++;
for (i = 0; i < n; i++)
{
if (!known[i] && time[now][i] && d[now] + time[now][i] < d[i])
d[i] = d[now] + time[now][i];
if (!known[i] && d[i] < mind)
{
mind = d[i];
next = i;
}
}
now = next;
}
if (d[n - 1] != INT_MAX)
printf("TEST %d Y %d\n", count, mom - d[n - 1]);
else
printf("TEST %d N\n", count);
for (i = 0; i < n; i++)
free(time[i]);
free(time);
}
return 0;
}