Dij的堆优化
#include<algorithm> #include<iostream> #include<cstdio> #include<cstring> #include<queue> #define M 100000 #define pa pair<int,int>//优先比较第一个元素 using namespace std; int d[M],n,m,cnt,head[M],next[M],u[M],dis[M],num,s,t; bool f[M]; void add(int from,int to,int di) { num++; u[num]=to; next[num]=head[from]; head[from]=num; dis[num]=di; } int main() { scanf("%d%d%d%d",&n,&m,&s,&t); for(int i=1;i<=m;i++) { int uu,vv,d; scanf("%d%d%d",&uu,&vv,&d); add(uu,vv,d); add(vv,uu,d); } memset(d,127/3,sizeof(d)); d[s]=0; priority_queue<pa,vector<pa>,greater<pa> > q;//堆优化 q.push(make_pair(0,s));//make一个pa 距离s为0 标号为s while(!q.empty()) { int p=q.top().second;//取出优先级最高的点的 q.pop(); if(f[p])//判重 continue; f[p]=1; for(int i=head[p];i;i=next[i]) { if(d[u[i]]>d[p]+dis[i]) { d[u[i]]=d[p]+dis[i]; q.push(make_pair(d[u[i]],u[i]));//make一个新的 pa } } } cout<<d[t]; return 0; }