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:;
}
}