Dijkstra+堆优化模板 (手写堆简单易懂)

版权声明:转载请注明出处(^_^),http://blog.csdn.net/whistlena https://blog.csdn.net/WhiStLenA/article/details/53172110
#include<cstdio>
#include<iostream>
#define MAXN 2510
#define INF 1000000000
using namespace std;
int q[MAXN*2],pos[MAXN*2];
int n,m,s,t,dis[MAXN];
struct node {
    int to;
    int next;
    int val;
};
node e[MAXN*5];
int head[MAXN],tot;
bool vis[MAXN];
inline void read(int&x) {
    int f=1;x=0;char c=getchar();
    while(c>'9'||c<'0') {if(c=='-') f=-1;c=getchar();}
    while(c>='0'&&c<='9') {x=(x<<3)+(x<<1)+c-48,c=getchar();}
    x=x*f;
}
inline void add(int x,int y,int z) {
    e[++tot].to=y;
    e[tot].val=z;
    e[tot].next=head[x];
    head[x]=tot;
}
inline void init(int x) {
    q[++tot]=x;
    pos[x]=tot;
    int p=tot;
    while(p>1) {
        if(dis[q[p]]<dis[q[p>>1]]) {
            swap(q[p],q[p>>1]);
            swap(pos[q[p]],pos[q[p>>1]]);
            p>>=1;
        }
        else break;
    }
    return;
}
inline void pop() {
    pos[q[1]]=0;
    q[1]=q[tot--];
    if(tot) pos[q[1]]=1;
    int x=2;
    while(x<=tot) {
        if(dis[q[x]]>dis[q[x+1]]) x++;
        if(dis[q[x]]<dis[q[x>>1]]) {
            swap(q[x],q[x>>1]);
            swap(pos[q[x]],pos[q[x>>1]]);
            x<<=1;
        }
        else break;
    }
    return;
}
int main() {
    int x,y,z;
    read(n);read(m);read(s);read(t);
    for(int i=1;i<=m;i++) {
        read(x);read(y);read(z);
        add(x,y,z);add(y,x,z);
    }
    for(int i=1;i<=n;i++) dis[i]=INF;
    tot=0;
    dis[s]=0;
    init(s);
    while(tot) {
        int u=q[1];
        pop();
        if(vis[u]) continue;
        vis[u]=true;
        for(int i=head[u];i;i=e[i].next) {
            int v=e[i].to;
            if(!vis[v]&&dis[v]>dis[u]+e[i].val) {
                dis[v]=dis[u]+e[i].val;
                init(v);
            }
        }
    }
    printf("%d\n",dis[t]);
    return 0;
}

没有更多推荐了,返回首页