代码插错了。。。。。。
```c
#include<iostream>
using namespace std;
int n,m;
int fa[50001];
int vis2[50001];
int ans;
int get(int x){
if(fa[x]==x){
return x;
}
return fa[x]=get(fa[x]);
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++) fa[i]=i;
for(int i=1;i<=m;i++){
int a,b,c;
cin>>a>>b>>c;
if(a==1){
if(b>n||c>n){
ans++;
continue;
}
int bb=get(b);
int cc=get(c);
if(vis2[cc]!=bb&&vis2[bb]!=cc){ //如果c不吃b,b也不吃c,就算同类。
fa[cc]=bb;
}else{
ans++;
continue;
}
}else{
if(b>n||c>n||b==c){
ans++;
continue;
}
int cc=get(c);
int bb=get(b);
if(vis2[bb]==0&&cc!=bb&&vis2[cc]!=bb){ //如果b没有指定吃谁且b和c不是同类且c不吃b;
vis2[b]=cc;//b吃c为真
}else{
ans++;
continue;
}
}
}
cout<<ans;
return 0;
}
```
by Called47 @ 2018-10-29 20:03:57
震惊!蒟蒻怒切noi原题!
by flowerletter @ 2018-10-29 20:05:30
@[Called47](/space/show?uid=94259)
if(vis2[bb]==0&&cc!=bb&&vis2[cc]!=bb){ //如果b没有指定吃谁且b和c不是同类且c不吃b;
vis2[b]=cc;//b吃c为真
}
这句话要把b原先的天敌和cc合并在一个并查集里面,并且c也是b天敌的天敌(题目里的ABC关系),也要合并在一起
by 基础不牢 @ 2018-10-29 20:23:26
@[Andy_Park](/space/show?uid=87637)
谢谢大佬,我去试试。
by Called47 @ 2018-10-29 20:52:38
@[白衣渡川](/space/show?uid=55650)
大佬您AKIOI
by Called47 @ 2018-10-29 21:41:11
@[Andy_Park](/space/show?uid=87637)
有个地方我还是不太明白
b原先的天敌我怎么找?
by Called47 @ 2018-10-29 21:43:04
@[Andy_Park](/space/show?uid=87637)
大佬我自己改了改,又拿了10分233
还是不太清楚哪里错了,是不是还是那三种关系错了?
谢谢大佬QAQ
```c
#include<iostream>
using namespace std;
int n,m;
int fa[50001];
int vis2[50001];
int ans;
int get(int x){
if(fa[x]==x){
return x;
}
return fa[x]=get(fa[x]);
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++) fa[i]=i;
for(int i=1;i<=m;i++){
int a,b,c;
cin>>a>>b>>c;
if(a==1){
if(b>n||c>n){
ans++;
continue;
}
int bb=get(b);
int cc=get(c);
if(vis2[cc]!=bb&&vis2[bb]!=cc){ //如果c不吃b,b也不吃c,就算同类。
fa[cc]=fa[bb];
vis2[bb]=vis2[cc];
int aa=get(vis2[vis2[bb]]);
vis2[aa]=fa[cc];
}else{
ans++;
continue;
}
}else{
if(b>n||c>n||b==c){
ans++;
continue;
}
int cc=get(c);
int bb=get(b);
if(vis2[bb]==0&&cc!=bb&&vis2[cc]!=bb){ //如果b没有指定吃谁且b和c不是同类且c不吃b;
vis2[bb]=fa[cc];
int aa=get(vis2[cc]);
vis2[cc]=fa[aa];
vis2[aa]=fa[bb];
}else{
ans++;
continue;
}
}
}
cout<<ans;
return 0;
}
```
by Called47 @ 2018-10-30 18:14:25
你可以看看第一个题解
by 基础不牢 @ 2018-10-30 18:51:21
哪位大佬救救我的代码//伤心++;
```cpp
#include <bits/stdc++.h>
#define f(h,y,l) for(int h=y;h<=l;h++)
#define zdsj 100005
using namespace std;
int fa[3*zdsj],n,ans=0;
int re()
{
char c=getchar();int res=0;
while('0'>c&&c<'9') c=getchar();
while('0'<=c&&c<='9')
res=(res<<3)+(res<<1)+c-'0',c=getchar();
return res;
}
void setmake(int a)
{
f(i,1,3*a) fa[i]=i;
}
int check(int a)
{
return fa[a]==a ? a : fa[a]=check(fa[a]);
}
int main()
{
int k;
scanf("%d%d",&n,&k);
f(i,1,k)
{
int xx=re(),loves=re(),hyl=re();
setmake(n);
if(loves>n||hyl>n)
{
ans++;
continue;
}
if(xx==1)
{
if(check(loves)==check(hyl+n)||check(loves+n)==check(hyl)||check(loves+2*n)==check(hyl+n))
{
ans++;
}
else
{
fa[check(loves)]=check(hyl);
fa[check(loves+n)]=check(hyl+n);
fa[check(loves+2*n)]=check(hyl+2*n);
}
}
else
{
if(check(loves)==check(hyl)||check(loves+n)==check(hyl+n)||check(loves+2*n)==check(hyl+2*n))
{
ans++;
}
else
{
fa[check(loves+n)]=check(hyl);
fa[check(loves+2*n)]=check(hyl+n);
fa[check(loves)]=check(hyl+2*n);
}
}
}
printf("%d",ans);
return 0;
}
```
by XieXuan @ 2019-02-04 13:30:14