大雾 1e11就是错的1e13就对了
查看原帖
大雾 1e11就是错的1e13就对了
226167
呆呆的她啊楼主2023/12/14 23:10

题目


下面代码 有么有佬解释下这个dj板子咋回事

#include <cstring>
#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;
const int N=100010;
int n,m,s,a,b,c;
#define inf 1e13+5
struct edge{int v,w;};
vector<edge> e[N];
long long  d[N];
int vis[N];
int prefix[N];
int num[N];
void dijkstra(int s){
for(int i=1;i<=n;i++)d[i]=inf;
	d[s]=0; 
	priority_queue<pair<long long ,int>> q;
	q.push({0,s});
	while(q.size()){
		auto t=q.top(); q.pop();
		int u=t.second;
		if(vis[u])continue; //再出队跳过
		//千万千万记住 pop在continue前面 切记 否则死循环
		vis[u]=1; //标记u已出队一点一次自己走while循环只有一次
		for(auto ed : e[u]){
			int v=ed.v, w=ed.w;
       //cout<<v<<endl;
			if(d[v]>d[u]+w){
				d[v]=d[u]+w;
				prefix[v]=u;
				q.push({-d[v],v}); //大根堆
			}
		}
	}
}
int main(){
	cin>>n>>m;
	for(int i=0; i<m; i++)
		
	{
		cin>>a>>b>>c, e[a].push_back({b,c});
		e[b].push_back({a,c});
		
	}
	dijkstra(1);
	if(d[n]==inf){cout<<-1;return 0;}
 int q=n;
	int ed=0;
	while(q!=1)
	{
	num[ed]=q;
    q=prefix[q];
		ed++;
	}
	 num[ed]=1;
	for(int i=ed;i>=0;i--)
	{
		cout<<num[i]<<" ";
		
	}
	  
}
2023/12/14 23:10
加载中...