Dijkstra+堆优化

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
#include<ctime>
#include<queue>
#include<vector>
using namespace std;
const int N=200005;
int n,m,s,tot,Next[N],head[N],to[N];
bool vis[N];
long long dis[N],val[N];
void add(int x,int y,long long z){
    tot++;
    to[tot]=y;
    val[tot]=z;
	Next[tot]=head[x];
	head[x]=tot;
}
struct Node{
	int id;
	long long dis;
	bool operator <( const Node &x)const{
        return x.dis < dis;
    }
};
priority_queue<Node> Q;
void dijkstra(){
	for(int i=1;i<=n;i++){
		dis[i]=2147483647;
		vis[i]=0;
	}
	dis[s]=0;
	Q.push((Node){s,0});
	while(!Q.empty()){
		Node u=Q.top();
		Q.pop();
		if(vis[u.id]){
			continue;
		}
		vis[u.id]=1;
		for(int i=head[u.id];i;i=Next[i]){
			int v=to[i];
			if(dis[v]>dis[u.id]+val[i]){
				dis[v]=dis[u.id]+val[i];
				if(!vis[v]){
					Q.push((Node){v,dis[v]});
				}
			}
		}
	}
	return;
}
int main(){
	scanf("%d%d%d",&n,&m,&s);
	for(int i=1;i<=m;i++){
		int u,v;
		long long w;
		cin>>u>>v>>w;
		add(u,v,w);
	}
	dijkstra();
	for(int i=1;i<=n;i++){
		printf("%lld ",dis[i]);
	}
	return 0;
}
posted @ 2019-07-16 13:33  prestige  阅读(218)  评论(0编辑  收藏  举报