首页 > 其他 > 详细

模板 - 图论 - 单源最短路

时间:2019-03-21 23:04:18      阅读:152      评论:0      收藏:0      [点我收藏+]

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

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

Dijkstra

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

const int INF=0x3f3f3f3f;
const int MAXN=1000010;
const int MAXM=500000;
struct qnode{
    int v;
    int c;
    qnode(int v=0,int c=0):v(v),c(c){}
    bool operator<(const qnode &r)const {
        return c>r.c;
    }
};

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

Edge E[MAXM];
int H[MAXN];

int top;
void addedge(int u,int v,int w){
    E[top].v=v;
    E[top].cost=w;
    E[top].next=H[u];
    H[u]=top;
}

bool vis[MAXN];
int dist[MAXN];

void Dijkstra(int n,int start){
    memset(vis,false,sizeof(vis));
    for(int i=1;i<=n;i++)dist[i]=INF;
    priority_queue<qnode> que;
    while(!que.empty())que.pop();
    dist[start]=0;
    que.push(qnode(start,0));
    qnode tmp;
    while(!que.empty()){
        tmp=que.top();
        que.pop();
        int u=tmp.v;
        if(vis[u])continue;
        vis[u]=true;
        for(int i=H[u];i;i=E[i].next){
            int v=E[i].v;
            int cost=E[i].cost;
            if(!vis[v]&&dist[v]>dist[u]+cost){
                dist[v]=dist[u]+cost;
                que.push(qnode(v,dist[v]));
            }
        }
    }
}



int main(){
    int n,m,s;
    while(~scanf("%d%d%d",&n,&m,&s)){
        top=0;
        memset(H,0,sizeof(H));
        for(int i=1;i<=m;i++){
            int u,v,w;
            scanf("%d%d%d",&u,&v,&w);
            ++top;
            addedge(u,v,w);
        }
        Dijkstra(n,s);
        for(int i=1;i<=n;i++){
            printf("%d%c",dist[i]>=0x3f3f3f3f?2147483647:dist[i]," \n"[i==n]);
        }
    }
}

模板 - 图论 - 单源最短路

原文:https://www.cnblogs.com/Yinku/p/10575322.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!