模板 - 图论 - 单源最短路

第一次用Markdown编辑器写博文呢。
单源最短路的模板,链式前向星写法。

非负权的单源最短路Dijkstra算法。

Dijkstra

#include<bits/stdc++.h>
using namespace std;

const int INF=0x3f3f3f3f;

/* begin 链式前向星 */

const int MAXN=1000010;
const int MAXM=2000010;

struct Edge{
    int v,w,next;
    Edge(int v=0,int w=0):v(v),w(w){}
};

int cnt_edge;
int head[MAXN+5];
Edge edge[MAXM+5];

inline void init_graph(int n){
    cnt_edge=0;
    memset(head+1,0,sizeof(head[0])*n);
}

inline void add_edge(int u,int v,int w){
    cnt_edge++;
    edge[cnt_edge].v=v;
    edge[cnt_edge].w=w;
    edge[cnt_edge].next=head[u];
    head[u]=cnt_edge;
}

/* end 链式前向星 */


/* begin Dijkstra */

bool vis[MAXN+5];
int dis[MAXN+5];

struct Edge_node{
    int v,w;
    Edge_node(int v=0,int w=0):v(v),w(w){}
    bool operator<(const Edge_node &e)const {
        return w>e.w;
    }
};


void Dijkstra(int n,int s){
    memset(vis+1,0,sizeof(vis[0])*n);
    for(int i=1;i<=n;i++) dis[i]=INF;

    priority_queue<Edge_node> pq;
    dis[s]=0;
    pq.push(Edge_node(s,0));
    while(!pq.empty()){
        int u=pq.top().v;
        pq.pop();
        if(vis[u])continue;
        vis[u]=1;
        for(int i=head[u];i;i=edge[i].next){
            int &v=edge[i].v;
            int &w=edge[i].w;
            if(!vis[v]&&dis[v]>dis[u]+w){
                dis[v]=dis[u]+w;
                pq.push(Edge_node(v,dis[v]));
            }
        }
    }
}

/* end Dijkstra */

int main(){
    int n,m,s;
    while(~scanf("%d%d%d",&n,&m,&s)){
        init_graph(n);

        for(int i=1;i<=m;i++){
            int u,v,w;
            scanf("%d%d%d",&u,&v,&w);
            add_edge(u,v,w);
        }

        Dijkstra(n,s);
        for(int i=1;i<=n;i++){
            printf("%d%c",dis[i]," \n"[i==n]);
        }
    }
}
posted @ 2019-03-21 22:41  韵意  阅读(172)  评论(0编辑  收藏  举报