求助
  • 板块CF20C Dijkstra?
  • 楼主3a51_
  • 当前回复0
  • 已保存回复0
  • 发布时间2022/1/10 21:13
  • 上次更新2023/10/28 12:32:18
查看原帖
求助
327444
3a51_楼主2022/1/10 21:13
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#define ll long long
using namespace std;
const ll MAXN = 1000005;
const ll MAXM = 1000005;
const ll inf = 2147483647;
ll n,m,S,T,dis[MAXN],head[MAXN],las[MAXN],ans[MAXN],Cnt,cnt,x,y,z,t;
ll to[MAXM],nxt[MAXM],val[MAXM];
bool vis[MAXN];
struct Node{
    ll id,w;
    friend bool operator<(const Node A,const Node B){
        return A.w>B.w;
    }
};
inline void add(ll bg,ll ed,ll w){
    to[++cnt]=ed;
	nxt[cnt]=head[bg];
	head[bg]=cnt;
	val[cnt]=w;
}
priority_queue<Node> Q;
void dijkstra(){
    for(ll i=1;i<=n;i++)
		dis[i]=inf;
    Node now;
	now.id=S;
	now.w=0;
	dis[S]=0;
    ll p,ww;
	Q.push(now);
    while(!Q.empty())
	{
        Node x=Q.top();
		Q.pop();
		p=x.id;
		ww=x.w;
        if(vis[p] || dis[p]!=ww)
			continue;
        vis[p]=1;
		ll u;
        for(register ll i=head[p];i;i=nxt[i])
		{
            u=to[i];
            if(dis[p]+val[i]<dis[u])
			{
				las[u]=p;
                dis[u]=dis[p]+val[i];
                now.id=u;
				now.w=dis[u];
                Q.push(now);
            }
        }
    }    
}

int main(){
	S=1;
    cin>>n>>m;
    for(ll i=1;i<=m;i++){
        cin>>x>>y>>z;
        add(x,y,z);
        add(y,x,z);
    }
    dijkstra();
    if(dis[n]==inf)
    {
    	cout<<-1;
    	return 0;
	}
    ans[++Cnt]=n;
    while(n!=1)
    	n=las[n],ans[++Cnt]=n;
    for(int i=Cnt;i>=1;i--)
    	cout<<ans[i]<<" ";
    return 0;
}
2022/1/10 21:13
加载中...