ZOJ-2504

单源最短路径,注意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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值