RT,我先是写了如下的判定方法:
bool f=0;
while(m--){
int u=read(), v=read();
scanf("%s",c+1);
if(c[1] == 'c'){
if(find(u) == find(v+n) || find(u+n) == find(v)){
f=1;
break;
}
merge(u,v);
merge(u+n,v+n);
}
else{
if(find(u) == find(v) || find(u+n) == find(v+n)){
f=1;
break;
}
merge(u,v+n);
merge(u+n,v);
}
}
if(f){
printf("-1\n");
continue;
}
没过,并提示我将并非无解的点判成了无解
但我把判定方法换成如下这种后(第二行),就能通过了:
for(int i=1;i<=n;i++){
if(find(i) == find(i+n)) { f=1; break; }
if(!vis[find(i)] && !vis[find(i+n)]){
ans += max(size[find(i)], size[find(i+n)]);
vis[find(i)] = vis[find(i+n)] = 1;
}
}
百思不得其解,为何第一种的判定是错误的?求大佬帮忙看看Orz