title

Dijikstra+Heap

#include<cstdio>
#include<queue>
#include<vector>
#include<cctype>
#include<cstring>
#define N 100010
#define rint register int 
#define inf 2147483647
using namespace std;
struct edge{
	int num,val;
	bool operator <(const edge &x) const{
		return val>x.val;
	}
};
priority_queue<edge> q;
vector <pair<int,int > >e[N];
int n,m,s,dis[N];
bool vis[N];
inline int read()
{
	int f=0,x=0;
	char ch=getchar();
	while(!isdigit(ch)) f|=(ch=='-'),ch=getchar();
	while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
	return f?-x:x;
}
inline void dij(int s){
	while(!q.empty()){
		int u=q.top().num;
		q.pop();
		if(!vis[u]){
			vis[u]=true;
			for(rint i=0;i<e[u].size();++i){
				int v=e[u][i].first;
				if(!vis[v]&&dis[v]>dis[u]+e[u][i].second){
					dis[v]=dis[u]+e[u][i].second;
					q.push((edge){v,dis[v]});
				}
			}
		}
	}
}
int main(){
	n=read();m=read();s=read();
	for(rint i=1;i<=m;++i){
		int u,v,w;
		u=read();v=read();w=read();
		if(u==v)	continue;
		e[u].push_back(make_pair(v,w));
	}
	for(rint i=1;i<=n;++i)	dis[i]=inf;
	dis[s]=0;
	q.push((edge){s,0});
	dij(s);
	for(rint i=1;i<=n;++i)	printf("%d ",dis[i]);
	return 0;
}
posted @ 2018-09-10 00:51  Horrigue_JyowYang  阅读(103)  评论(0编辑  收藏  举报