SPFA

luogu3371

(os:还是模板比较友善)

代码

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <queue>
#define N 500005
#define inf 2147483647
#define ll long long 
using namespace std;

int n,m,s; 

struct node
{
	int to,nt;
	ll w;
}E[N];

int num,p[N];
void add(int x,int y,int v)
{
	E[++num].to=y;E[num].w=v;
	E[num].nt=p[x];p[x]=num;
}

ll dis[N];bool flag[N];queue<int> q;
void spfa(int s)
{
	for(int i=1;i<=n;i++) dis[i]=inf;
	q.push(s);flag[s]=1;dis[s]=0;
	while(!q.empty())
	{
		int k=q.front();q.pop();
		for(int e=p[k];e;e=E[e].nt)
		{
			int kk=E[e].to;
			if(dis[kk]-dis[k]>E[e].w)
			{
				dis[kk]=dis[k]+E[e].w;
				if(!flag[kk]) {flag[kk]=1;q.push(kk);}
			}
		}
		flag[k]=0;
	}
}

int main()
{
	scanf("%d%d%d",&n,&m,&s);
	for(int i=1;i<=m;i++)
	{
		int x,y,v;scanf("%d%d%d",&x,&y,&v);
		add(x,y,v);
	}
	spfa(s);
	for(int i=1;i<=n;i++) printf("%lld ",dis[i]);
	return 0;
}
原文地址:https://www.cnblogs.com/XYZinc/p/7395997.html