dfs SPFA WA#9求助
查看原帖
dfs SPFA WA#9求助
478861
Gumbo楼主2022/10/5 16:07

RT,请问为啥会WA?换成BFS就过了。

#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
short fst[2005],nt[6005],val[6005],to[6005];
int dis[2005];
short num[2005];
bool pd[2005];
int opt;
inline short reads(void){
    register short ans=0;
    register char us=getchar();
    while(us<'0'||us>'9')us=getchar();
    while(us>='0'&&us<='9'){
        ans=(ans<<1)+(ans<<3)+(us^48);
        us=getchar();
    }
    return ans;
}
inline short readzf(void){
    register short ans=0;
    register short k=1;
    register char us=getchar();
    while(us<'0'||us>'9'){
        k=1-(us=='-')-(us=='-');
        us=getchar();
    }
    while(us>='0'&&us<='9'){
        ans=(ans<<1)+(ans<<3)+(us^48);
        us=getchar();
    }
    return ans*k;
}
void add(short u,short v,short w){
    ++opt;
    nt[opt]=fst[u];
    fst[u]=opt;
    val[opt]=w;
    to[opt]=v;
    if(w>=0){
        ++opt;
        nt[opt]=fst[v];
        fst[v]=opt;
        val[opt]=w;
        to[opt]=u;
    }
}
int main(){
    bool flag=false;
    short T;
    T=reads();
    short n,m;
    register short u,v,w,r;
    deque<short>q1;
    register int i,j,k;
    for(i=0;i<T;++i){
        opt=0;
        n=reads(),m=reads();
        while(!q1.empty())q1.pop_front();
        memset(fst,0,sizeof fst);
        memset(nt,0,sizeof nt);
        memset(pd,false,sizeof pd);
        memset(dis,0x7f,sizeof dis);
        memset(num,0,sizeof num);
        flag=false;
        for(j=0;j<m;++j){
            u=reads();
            v=reads();
            w=readzf();
            flag|=(u==v&&w<0);
            add(u,v,w);
        }
        if(flag){
            printf("YES\n");
            continue;
        }
        dis[1]=0;
        q1.push_front(1);
        pd[1]=true;
        while(!q1.empty()){
            r=q1.front();
            q1.pop_front();
            for(k=fst[r];k;k=nt[k]){
                if(dis[to[k]]>dis[r]+val[k]){
                    dis[to[k]]=dis[r]+val[k];
                    if(!pd[to[k]]){
                        ++num[to[k]];
                        if(num[to[k]]>=n){
                            printf("YES\n");
                            goto ed;
                        }
                        q1.push_front(to[k]);
                        pd[to[k]]=true;
                    }
                }
            }
            pd[r]=false;
        }
        printf("NO\n");
        ed:;
    }
}
2022/10/5 16:07
加载中...