Simple path(最短路)

Simple path

题意:

给你一棵树,问你从一个点到另一个点再短距离的路径是什么?

思路:

djkstra+记录路径

代码

#include<bits/stdc++.h>

#define int long long 
#define IOS ios::sync_with_stdio(false);cin.tie(nullptr)
#define x first
#define y second

using namespace std;

typedef pair<int, int> PII;

const int N = 5e5 + 10, INF = 2e9 + 10;

int n, s, en, idx;
int h[N], dist[N], pre[N];
bool st[N];
set<int> ss;

struct node
{
	int u, v, w;
}e[N];

void add(int u, int v, int w)
{
	e[++idx].w = w;
	e[idx].v = v;
	e[idx].u = h[u];
	h[u] = idx;
}

inline void djkstra(int s)
{
	memset(dist, INF, sizeof dist);

	dist[s] = 0;
	priority_queue<PII, vector<PII>, greater<PII> > q;

	q.push({ 0, s });

	while (!q.empty())
	{
		PII t = q.top();
		q.pop();
		int sa = t.y;
		if (st[sa]) continue;
		st[sa] = true;

		for (int i = h[sa]; i; i = e[i].u)
		{
			int j = e[i].v;

			if (dist[j] > dist[sa] + e[i].w)
			{
				dist[j] = dist[sa] + e[i].w;
				pre[j] = sa;
			}
			q.push({ dist[j], j });
		}
	}
}

signed main()
{
	IOS;
	cin >> n >> s >> en;
	int m = n--;
	while (m--)
	{
		int u, v;
		ss.insert(u);
		ss.insert(v);
		cin >> u >> v;
		add(u, v, 1);
		add(v, u, 1);
	}
	djkstra(s);
	stack<int> stac;

	int st = en;

	while (st)
	{
		stac.push(st);
		st = pre[st];
	}

	while (!stac.empty())
	{
		cout << stac.top() << " ";
		stac.pop();
	}

	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值