欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

迪杰特斯拉算法堆优化

程序员文章站 2022-05-22 11:22:03
...

迪杰特斯拉算法堆优化

#include<bits/stdc++.h>
using namespace std;
/*Dijkstra算法:
 *1.初始化dis[start]=0,其他点,dis[]=无穷大;所有点初始化le[]=0 
 *2.在le[]=0的里面找dis最小的点x,令le[x]=1; 
 *3.更新x的邻接点y,(x,y)边的权值为W,若dis[y]>dis[x]+z,则dis[y]=dis[x]+z; 
 *4.重复2,3直到所有点都变为1; 
 */ 

class N{
	public:
		int x;//可访问的点
		int w;//权值
	bool operator < (N a) const{
		return this->w>a.w;
	}
	N(int a,int b): x(a),w(b) {
		
	}
	N(){
		x=0;
		w=0;
	}
    }
};
const long inf=2147483647;
vector<N> vec[100005];//邻接表 
int dis[100005];
int n;
int m;
int s;

void dijkstra(int x){
	int le[n+1];//确定点是否被访问
	priority_queue<N> que;
	for(int i=1;i<=n;i++){
		dis[i]=inf;
	}
	memset(le,0,sizeof(le));
	que.push(N(x,0)); 
	dis[x]=0; 
	while(que.empty()==0){
		N t=que.top();
		que.pop();
		if(le[t.x]==1){
			continue; 
		} 
		le[t.x]=1; 
		int len=vec[t.x].size();
		for(int i=0;i<len;i++){
			if(dis[vec[t.x][i].x]>dis[t.x]+vec[t.x][i].w){
				
				dis[vec[t.x][i].x]=dis[t.x]+vec[t.x][i].w;
				que.push(N(vec[t.x][i].x,dis[vec[t.x][i].x]));
			}
		}
		
		
		
	} 
	
	
} 



int main()
{
	int u,v,w;
	cin>>n>>m>>s;
	for(int i=1;i<=m;i++)
	{
		scanf("%d%d%d",&u,&v,&w);
		vec[u].push_back(N(v,w));
		//无向图的话加上这个
		//vec[v].push_back(N(u,w));
	}
	dijkstra(s);
	for(int i=1;i<=n;i++)
	{
		cout<<dis[i]<<" ";
	}
	
}