SPFA

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<algorithm>
#include<ctime>
#include<queue>
using namespace std;
const int N=10005,M=500005,INF=2147483647;
int n,m,s,Cnt,dis[N],vis[N],head[M];
struct Edge{
  int u,v,w,Next;
}Edge[M];
void Push(int u,int v,int w){
  Edge[++Cnt].Next=head[u];
  Edge[Cnt].v=v;
  Edge[Cnt].w=w;
  head[u]=Cnt;
}
void SPFA(){
  queue<int> q;
  for(int i=1; i<=n; i++){
    dis[i]=INF;
    vis[i]=0;
  }
  q.push(s);
  dis[s]=0;
  vis[s]=1;
  while(!q.empty()){
    int u=q.front();
    q.pop();
	vis[u]=0;
    for(int i=head[u];i;i=Edge[i].Next){
      int v=Edge[i].v; 
      if(dis[v]>dis[u]+Edge[i].w){
        dis[v]=dis[u]+Edge[i].w;
        if(vis[v]==0){
          vis[v]=1;
          q.push(v);
        }
      }
    }
  }
}
int main(){
   int u,v,w;
	scanf("%d%d%d",&n,&m,&s);
	for(int i=1;i<=m;i++){
		scanf("%d%d%d",&u,&v,&w);
		Push(u,v,w);
	}
	SPFA();
	for(int i=1;i<=n;i++)
		if(s==i){
			cout<<0<<" ";
		}
		else{
			cout<<dis[i]<<" ";
		}
	return 0;
}
posted @ 2019-07-16 13:23  prestige  阅读(104)  评论(0编辑  收藏  举报