以事件是否同时发生建立并查集,i-A表示i属于A,即par[i],i-B为par[i+n],i-C为par[i+2*n]
类似题目推荐 poj1703
#include<stdio.h>
#include<string.h>
#define N 300005
int par[N];
int rank[N];
void init(int tn)
{
for(int i=1;i<=tn;i++)par[i]=i,rank[i]=0;
}
int find(int x)
{
if(par[x]==x)return x;
return par[x]=find(par[x]);
}
void unite(int x,int y)
{
x=find(x);
y=find(y);
if(x==y)return;
if(rank[x]<rank[y])par[x]=y;
else
{
par[y]=x;
if(rank[x]==rank[y])rank[x]++;
}
}
bool same(int x,int y)
{
return find(x)==find(y);
}
int n,k;
int d,x,y;
void solve()
{
int ans=0;
while(k--)
{
scanf("%d%d%d",&d,&x,&y);
if(x>n||y>n||x<1||y<1)ans++;
else
{
if(d==1)
{
if(same(x,y+n)||same(x,y+2*n))ans++;
else
{
unite(x,y);
unite(x+n,y+n);
unite(x+2*n,y+2*n);
}
}
else
{
if(same(x,y)||same(x,y+2*n))ans++;
else
{
unite(x,y+n);
unite(x+n,y+2*n);
unite(x+2*n,y);
}
}
}
}
printf("%d\n",ans);
}
int main()
{
scanf("%d%d",&n,&k);
init(n*3);
solve();
return 0;
}