文章目录
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;
}