SPFA能AC?!
查看原帖
SPFA能AC?!
343354
蒟蒻王孑楼主2020/9/19 10:40

网上找的代码,抱着看笑话的心里一交,结果真A了

#include<queue> 
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define N 100010
using namespace std;
inline int p(int& x){ ++x; return x&=131071; }
inline bool gmin(int& x,int y){
    return x>y?(x=y)|1:0; 
}
struct edge{ int v,c,nt; } G[N<<2];
int n,m,s,cnt,d[N],h[N],in[N],c[N],q[1<<17];
int main(){
    scanf("%d%d%d",&n,&m,&s);
    for(int i=1;i<=n;++i) d[i]=1<<30;
    for(int x,y,c;m--;){
        scanf("%d%d%d",&x,&y,&c);
        G[++cnt]=(edge){y,c,h[x]}; h[x]=cnt;
    }
    d[s]=0; int l=0,r=0; q[++r]=s;
    for(int x,t=1,j;l!=r;){
        x=q[p(l)];
        if(c[x]>t){ q[p(r)]=x; t+=20; continue; }
        in[x]=0; j=l+1&131071;
        for(int v,i=h[x];i;i=G[i].nt)
            if(gmin(d[v=G[i].v],d[x]+G[i].c)){
                if(!in[v]){
                    ++c[x]; q[p(r)]=v; in[v]=1;
                }
                if(d[q[j]]>d[q[r]]) swap(q[j],q[r]);
            }
    }
    for(int i=1;i<=n;++i) printf("%d ",d[i]);
}
2020/9/19 10:40
加载中...