#include
using namespace std;
int f[4000];int r[4000];int flag;
int find(int x){
if(x==f[x]) return x;
int z=f[x];
f[x]=find(f[x]);
f[z]=f[x];
r[x]=(r[x]+r[z])%2;
return f[x];
}
void uni(int a,int b){
int fa=find(a);int fb=find(b);
if(fa!=fb){//cout<<"*"<<endl;
f[fa]=fb;r[fa]=(r[b]+1-r[a])%2;
}
else{
if(r[a]==r[b]) flag=1;
}
}
int main(){
int t;cin>>t;
for(int k=1;k<=t;k++){
flag=0;
int n1,n2;scanf("%d%d",&n1,&n2);
for(int i=1;i<=n1;i++){
r[i]=0;f[i]=i;
}
for(int i=0;i<n2;i++){
int a,b;scanf("%d%d",&a,&b);
uni(a,b);
// if(flag1) break;
}
if(flag1) printf(“Scenario #%d:\nSuspicious bugs found!\n”,k);
else printf(“Scenario #%d:\nNo suspicious bugs found!\n”,k);
if(k!=t) printf("\n");
}
}
服了自己了,上周刚刚写过这次还卡了一会儿。
永远都忘记int find(int x)函数是有返回值的。
代码如下:
#include<iostream>
using namespace std;
int f[4000];int r[4000];int flag;
int find(int x){
if(x==f[x]) return x;
int z=f[x];
f[x]=find(f[x]);
f[z]=f[x];
r[x]=(r[x]+r[z])%2;
return f[x];
}
void uni(int a,int b){
int fa=find(a);int fb=find(b);
if(fa!=fb){//cout<<"*"<<endl;
f[fa]=fb;r[fa]=(r[b]+1-r[a])%2;
}
else{
if(r[a]==r[b]) flag=1;
}
}
int main(){
int t;cin>>t;
for(int k=1;k<=t;k++){
flag=0;
int n1,n2;scanf("%d%d",&n1,&n2);
for(int i=1;i<=n1;i++){
r[i]=0;f[i]=i;
}
for(int i=0;i<n2;i++){
int a,b;scanf("%d%d",&a,&b);
uni(a,b);
// if(flag==1) break;
}
if(flag==1) printf("Scenario #%d:\nSuspicious bugs found!\n",k);
else printf("Scenario #%d:\nNo suspicious bugs found!\n",k);
if(k!=t) printf("\n");
}
}