L2-001 紧急救援 (25 分) 最短路

Dijkstra维护两个值。递归找起点。

Code:

#include <bits/stdc++.h>
const int inf = 1e9 + 7;
const int maxn = 505;
int a, b, c, n, m, ss, ee;
int dis[maxn], s[maxn][maxn], cnt[maxn], people[maxn], num[maxn], pre[maxn];
bool book[maxn];
using namespace std;
void print(int k)
{
	if (k == ss)
	{
		printf("%d", ss);
		return;
	}
	print(pre[k]);
	printf(" %d", k);
}
int main()
{
	scanf("%d%d%d%d", &n, &m, &ss, &ee);
	for (int i = 0; i < n; i++)
		scanf("%d", &people[i]);
	fill(dis, dis + maxn, inf);
	fill(s[0], s[0] + maxn * maxn, inf);
	fill(book, book + maxn, false);
	while (m--)
	{
		scanf("%d%d%d", &a, &b, &c);
		s[a][b] = c;
		s[b][a] = c;
	}
	dis[ss] = 0;
	cnt[ss] = 1;
	num[ss] = people[ss];
	for (int i = 0; i < n; i++)
	{
		int f = -1, minn = inf;
		for (int j = 0; j < n; j++)
		{
			if (book[j] == false && dis[j] < minn)
			{
				f = j;
				minn = dis[j];
			}
		}
		book[f] = true;
		if (f == -1)
			break;
		for (int j = 0; j < n; j++)
		{
			if (book[j] == false && dis[j] > dis[f] + s[f][j])
			{
				dis[j] = dis[f] + s[f][j];
				cnt[j] = cnt[f];
				num[j] = num[f] + people[j];
				pre[j] = f;
			}
			else if (book[j] == false && dis[j] == dis[f] + s[f][j])
			{
				cnt[j] += cnt[f];
				if (num[j] < num[f] + people[j])
				{
					num[j] = num[f] + people[j];
					pre[j] = f;
				}
			}
		}
	}
	printf("%d %d\n", cnt[ee], num[ee]);
	print(ee);
}

 

全部评论

相关推荐

shtdbb_:还不错,没有让你做了笔试再挂你
点赞 评论 收藏
分享
10-09 00:50
已编辑
长江大学 算法工程师
不期而遇的夏天:1.同学你面试评价不错,概率很大,请耐心等待;2.你的排名比较靠前,不要担心,耐心等待;3.问题不大,正在审批,不要着急签其他公司,等等我们!4.预计9月中下旬,安心过节;5.下周会有结果,请耐心等待下;6.可能国庆节前后,一有结果我马上通知你;7.预计10月中旬,再坚持一下;8.正在走流程,就这两天了;9.同学,结果我也不知道,你如果查到了也告诉我一声;10.同学你出线不明朗,建议签其他公司保底!11.同学你找了哪些公司,我也在找工作。
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务