80pts求助
查看原帖
80pts求助
1412938
A7F3jK9pR0xf_楼主2024/8/15 09:58

Dijkstra 堆优化

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e4+10;
const ll INF = 1e18;
vector<pair<int, int> >g[N];
int t[N], p[N], n, m;
ll dis[N];
bool tag[N];
struct node
{
	int id;
	ll w;
	friend bool operator < (const node &n1, const node &n2)
	{
		return n1.w > n2.w;
	}	
};
priority_queue<node>q;
inline void Dijkstra(int s)
{
	for(int i = 1;i <= n;++i)
	{
		if(i != s) dis[i] = INF;
		else dis[i] = 0;
		t[i] = 0;
		q.push((node){i, dis[i]});
	}
	p[s] = s; 
	int cnt = 0;
	while(cnt < n)
	{
		node cur;
		while(q.size())
		{
			cur = q.top();
			q.pop();
			if(cur.w == dis[cur.id] && !tag[cur.id])
				break;	
		}	
		tag[cur.id] = 1;
		cnt++;
		for(auto v : g[cur.id])
		{
			if(!tag[v.first])
			{
				if(dis[v.first] > dis[cur.id]+v.second+t[cur.id])
				{
					dis[v.first] = dis[cur.id]+v.second+t[cur.id];
					p[v.first] = cur.id;
					t[v.first] = t[cur.id]+1;
					q.push((node){v.first, dis[v.first]});
				}
			}
		} 
	} 
}
inline void print(int u)
{
	if(u == 1)
	{
		cout << "1 ";
		return;
	}
	print(p[u]);
	cout << u << " ";
}
int main()
{
	int u, v, w;
	cin >> n >> m;
	while(m--)
	{
		scanf("%d%d%d", &u, &v, &w);
		g[u].push_back(make_pair(v, w));
	}
	Dijkstra(1);
	if(dis[n] >= INF)
	{
		cout << -1;
		return 0;
	}
	cout << dis[n] << "\n";
	print(n);
	return 0;	
} 

2024/8/15 09:58
加载中...