Dijkstra模板

来源:互联网 发布:知乎 俄罗斯 计算机 编辑:程序博客网 时间:2024/05/21 21:33
#include <cstdio>#include <queue>#include <algorithm>int n,m,begin,end;struct edge{    int u,v,w,next;} e[6200 * 2 + 1];int a[2500 + 1],num;inline void addedge(int u,int v,int w){    num++;    e[num].u = u;    e[num].v = v;    e[num].w = w;    e[num].next = a[u];    a[u] = num;}int dis[2500 + 1],vis[2500 + 1];struct st{    int n,w;    bool operator <(const st &a) const{        return a.w < w;    }};std::priority_queue<st> q;inline void dijkstra(){    for(int i = 1;i <= n;i++)    dis[i] = 0x7fffffff;    dis[begin] = 0;    q.push((st){begin,0});    while(!q.empty()){        int x = q.top().n;        q.pop();        if (vis[x])continue;        vis[x] = 1;        for(int i = a[x];i;i = e[i].next){//这行中间一定要写i,这是终止循环的条件,当i=0时没有邻接边,停止循环            int y = e[i].v;            if (dis[x] + e[i].w < dis[y]){                dis[y] = dis[x] + e[i].w;                q.push((st){y,dis[y]});            }        }    }}int main(){    scanf("%d %d %d %d",&n,&m,&begin,&end);    for(int i = 1;i <= m;i++){        int u,v,w;        scanf("%d %d %d",&u,&v,&w);        addedge(u,v,w);        addedge(v,u,w);    }    dijkstra();    printf("%d",dis[end]);}
原创粉丝点击