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

洛谷_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;
}

猜你喜欢

转载自blog.csdn.net/qq_63173957/article/details/125336559