并查集
想法很简单
开两个数组
吃 与 被吃
然而 炸了我一下午
mlgb
贴个错误代码
吃饭去了
烦
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int maxn=55555;
int fa[maxn];
int eat[maxn];
int ate[maxn];
int find(int x)
{
return fa[x]==x?x:fa[x]=find(fa[x]);
}
void merge(int x,int y)
{
int fx,fy;
fx=find(x);
fy=find(y);
if(fx!=fy)
fa[fy]=fx;
}
int main()
{
int n,k;
int com,n1,n2;
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++)
{
eat[i]=0;
ate[i]=0;
fa[i]=i;
}
int num=0;
for(int i=0;i<k;i++)
{
scanf("%d%d%d",&com,&n1,&n2);
if(com==1)
{
if(n1>n||n2>n)
{num++;continue;}
if(find(n1)==find(eat[n2])||find(n2)==find(eat[n1]))
{num++;continue;}
if(!(eat[n1]==0&&ate[n2]==0))
{
if(find(eat[n1])==find(ate[n2]))
{num++;continue;}
}
// if(find(n2)==find(ate[n1])||find(n1)==find(ate[n2]))
// {num++;continue;}
merge(n1,n2);
}
else if(com==2)
{
if(n1>n||n2>n)
{num++;continue;}
// else
// {
if(n1==n2)
{num++;continue;}
if(find(n1)==find(n2))
{num++;continue;}
// if(find(ate[n1])==find(n2))
// {num++;continue;}
if(find(n1)==find(eat[n2]))
{num++;continue;}
if(!(eat[n1]==0&&ate[n2]==0))
{
if(find(eat[n1])==find(ate[n2]))
{num++;continue;}
}
if(!(eat[n1]==0&&eat[n2]==0))
//if(eat[n1]==find(eat[n2])||eat[n2]==find(eat[n1]))
{
if(find(eat[n1])==find(eat[n2]))
{num++;continue;}
}
if(eat[n1]==0)
eat[n1]=n2;
else
merge(eat[n1],n2);
if(ate[n2]==0)
ate[n2]=n1;
else
merge(ate[n2],n1);
// }
}
}
printf("%d\n",num);
return 0;
}