链式前向星+迪杰特斯拉堆优化

#include <bits/stdc++.h>
using namespace std;
const int maxn=19999;
int n,m,s,t;
struct edge{
	int nxt,to,w;
}d[maxn];//链式前向星 
struct node{
	int num,x;
	bool operator <(const node &tmp)const{
		return x>tmp.x;
	} //为了优先队列 
}temp;
int dis[maxn],head[maxn],cnt=1;
void add(int u,int v,int w){
	d[cnt].to=v;
	d[cnt].nxt=head[u];
	d[cnt].w=w;
	head[u]=cnt++;
}//加边
int vis[maxn];
void dij(int s)//迪杰特斯拉
{
	priority_queue<node>q;
	memset(dis,20,sizeof(dis));
	dis[s]=0;
	temp.num=s;temp.x=0;q.push(temp);
	while(!q.empty()){
		node ans=q.top();
		q.pop();
		if(dis[ans.num]!=ans.x)		continue;
		if(vis[ans.num])	continue;
		vis[ans.num]=1;
		for(int i=head[ans.num];i;i=d[i].nxt)
		{
			edge e=d[i];
			if(dis[e.to]>dis[ans.num]+e.w){
				dis[e.to]=dis[ans.num]+e.w;
				if(vis[e.to])	continue;
				temp.num=e.to,temp.x=dis[e.to];
				q.push(temp);
			}
		}
	}
	return;
} 
int main()
{
	cin>>n>>m>>s>>t;
	for(int i=1;i<=m;i++)
	{
		int l,r,t;
		cin>>l>>r>>t;
		add(l,r,t);
		add(r,l,t);
	}
	dij(s);
	cout<<dis[t];
}
原文地址:https://www.cnblogs.com/iss-ue/p/12679617.html