CodeForce20C

這是一個裸的最短路的模板題,可是它須要輸出路徑。node

用dijkstra的話首先敲一個最短路的板子,其次開一個數組p[]來記錄路徑,可是怎麼存呢?咱們須要記錄每個點的前驅,由於若是記錄後邊的話,一個點可能連多個節點,可是每個點的前驅只有一個點,因此記錄每個被壓入堆的點便可,最後輸出。若是用spfa的話,也同理存入被鬆弛的點。c++

1.必定要注意數據類型,long long 足以讓你死掉,固然也要所有修改,注意全局這個變量的出現都要修改。數組

2.注意加邊的時候是有向邊仍是無向邊。spa

3.記錄路徑必定是p[i]=j表明從j->i的路徑,因此輸出要倒序。code

代碼blog

#include<bits/stdc++.h>
#define maxn  500005
#define maxm 500005
using namespace std;
struct edge{
    int next;
    long long w;
    int v;
}e[maxm];
int n,m,tot=0,s;
int head[maxn],vis[maxn],pos[maxn];
long long dis[maxn];
struct node{
    long long w;
    int now;
    inline bool operator <(const node &x)const
    {
        return w>x.w;//這裏注意符號要爲'>'
    } 
};
inline void add(int u,int v,long long w){
    e[++tot].next=head[u];
    head[u]=tot;
    e[tot].w=w;
    e[tot].v=v;    
}
priority_queue<node>q;
void dijkstra(){
    for(int i=1;i<=n;i++) {
        dis[i]=9223372036854775806;
    }
    dis[1]=0;
    q.push((node){0,1});
    while(!q.empty()){
        node x=q.top();
        int u=x.now;        
        q.pop();
        if(vis[u]==1) continue;
        vis[u]=1;
        for(int i=head[u];i;i=e[i].next){
            int v=e[i].v;
            if(dis[v]>dis[u]+e[i].w){
                dis[v]=dis[u]+e[i].w;
                q.push((node){dis[v],v});
                pos[e[i].v]=u;
            }
        }
    }
}
int main(){
    cin>>n>>m;
    for(int i=1,x,y,z;i<=m;i++){
        cin>>x>>y>>z;
        add(x,y,z);
        add(y,x,z);
    }
    dijkstra();
    bool flag=false;
    int num=0;    
    int ans[maxn];
    for(int i=n;i;i=pos[i]){
        ans[++num]=i;
        if(i==1){
            flag=true;
        }
    }
    if(flag==true){
        for(int i=num;i>=1;i--){
            cout<<ans[i]<<" ";
        } 
    }
    else cout<<-1;
    return 0;
}
相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息