SPAF模板

时间:2022-05-21 15:04:13
#include <iostream>
#include <cstring>
#include <queue>
#include <cstdio> #define INF 0x3f3f3f
using namespace std; const int L = ; struct Edge{
int to;
int next;
int dis;
}e[L*];
int n,m,s;
int dist[L];
bool tag[L];
int num[L];
int head[L];
bool SPAF(int v0)
{
queue<int> q;
dist[v0]=;
q.push(v0);
num[v0]++;
tag[v0]=true;
while(!q.empty())
{
int t=q.front();
q.pop();
tag[t]=false;
for(int i=head[t];i!=-;i=e[i].next)
{
int v=e[i].to;
if(dist[v]>dist[t]+e[i].dis)
{
dist[v]=dist[t]+e[i].dis;
if(!tag[v])
{
tag[v]=true;
q.push(v);
num[v]++;
if(num[v]>n) return false;
}
}
}
}
return true;
} int main()
{
cin>>n>>m>>s;
int u,v,w;
for(int i=;i<=n;i++)
{
head[i]=-;
dist[i]=INF;
tag[i]=false;
num[i]=;
}
for(int i=;i<=m;i++)
{
scanf("%d%d%d",&u,&v,&w);
e[i].to=v;
e[i].dis=w;
e[i].next=head[u];
head[u]=i;
}
if(SPAF(s))
{
for(int i=;i<=n;i++)
if(dist[i]<INF)
cout<<dist[i]<<endl;
else
cout<<"NO PATH"<<endl;
}
return ;
}