洛谷_P3371 【模板】单源最短路径(弱化版)_SPFA

//
#include<bits/stdc++.h>
using namespace std;
const int INF=0x3f3f3f3f;
const int N=1e6+7;
const int M=2e6+7;
int n,m;
int h[N],pos;
struct edge{ int y,data,next; }e[M];
void init()
{
pos=0;
for( int i=0;i<N;i++ ) h[i]=-1;
for( int i=0;i<M;i++ ) e[i].next=-1;
}
void add( int x,int y,int data )
{
e[pos].y=y;
e[pos].data=data;
e[pos].next=h[x];
h[x]=pos++;
}
int dis[N];
bool inq[N];
int ne[N];
int dad[N];
bool SPFA( int start )
{
int x,y,data,i;
memset( dis,0x3f,sizeof( dis ) );
memset( inq,0,sizeof( inq ) );
memset( ne,0,sizeof( ne ) );
dis[start]=0;
inq[start]=1;
ne[start]=1;
queue<int> q; q.push( start ); // queue<int> q;
while( !q.empty() )
{
x=q.front(); q.pop(); inq[x]=0; // q.pop();
for( i=h[x];~i;i=e[i].next )
{
y=e[i].y; data=e[i].data;
if( dis[y] > dis[x]+data )
{
dis[y]=dis[x]+data;
ne[y]=ne[x]+1;
if( ne[y]>n ) return false;
if( !inq[y] ) { q.push( y ); inq[y]=1; }
}
}
}
return true;
}
int main()
{
int start,x,y,data,i;
while( cin>>n>>m>>start )
{
init();
while( m-- )
{
cin>>x>>y>>data;
add( x,y,data );
}
SPFA( start );
for( i=1;i<=n;i++ )
{
if( i!=1 ) cout<<" ";
if( dis[i]==INF ) cout<<( ((long long)1<<31)-1 );
else cout<<dis[i];
} // dis[i]
cout<<endl;
}
return 0;
}