1. 程式人生 > >Dijkstra+堆優化模板 (手寫堆簡單易懂)

Dijkstra+堆優化模板 (手寫堆簡單易懂)

#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; }