SPFA模板

  • O(kE)=O(E),k为常数,即遍历所有边;可退化成O(VE)
  • #include<bits/stdc++.h>
    #define MAXM 500010
    #define MAXN 100010
    using namespace std;
    int n,m,s,tot;
    int head[MAXN],dis[MAXN],cnt[MAXN];
    bool vis[MAXN];
    struct node{
        int to,w,nxt;
    }e[MAXM];
    void add(int u,int v,int w){
        e[tot].to=v;
        e[tot].w=w;
        e[tot].nxt=head[u];
        head[u]=tot;
    }
    void SPFA(int s){
        queue<int>q;
        dis[s]=0;
        q.push(s);
        while(!q.empty()){
            int u=q.front();q.pop();
            vis[u]=0;
            for(int i=head[u];i;i=e[i].nxt){
                int v=e[i].to,w=e[i].w;
                if(dis[v]>dis[u]+w){
                    dis[v]=dis[u]+w;
                    cnt[v]=cnt[u]+1;
                    if(cnt[v]>n){cout<<"有负环"<<endl;return;}
                    if(!vis[v]){
                        vis[v]=1;
                        q.push(v);
                    }
                }
            }
        }
    }
    int main(){
        scanf("%d%d%d",&n,&m,&s);
        for(int i=1;i<=n;i++) dis[i]=1e9;
        for(int i=1;i<=m;i++){
            int u,v,w;
            scanf("%d%d%d",&u,&v,&w);
            add(u,v,w);
        } 
        SPFA(s);
        for(int i=1;i<=n;i++){
            if(dis[i]>=1e9) printf("2147483647 ");
            else printf("%d ",dis[i]);
        }
        return 0;
    }

     

posted @ 2019-08-07 16:38  song_jian  阅读(227)  评论(0编辑  收藏  举报