Dijkstra+堆優化模板 (手寫堆簡單易懂)
阿新 • • 發佈:2019-01-30
#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;
}