请参考《挑战程序设计竞赛第二版》P87~90 (并查集一章节)
刚开始一直runtime error……一直查不出来……最后发现MAXN定义成50005太小了,要3*50005才行……真是蠢……
#include<cstdio>
#define MAXN 3*50000+5
int par[MAXN],rank[MAXN];
void init(int n)
{
for(int i=1;i<=n;i++) par[i]=i,rank[i]=0;
}
int find(int x)
{
if(par[x] == x) return x;
else 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 isSame(int x,int y){return( find(x) == find(y) );}
int main()
{
int n,k,d,x,y;
scanf("%d%d",&n,&k);
init(3*n);
int ans=0;
for(int i=1;i<=k;i++)
{
scanf("%d%d%d",&d,&x,&y);
if(x <=0 || x > n ||y <= 0 || y > n)//编号有问题
{
ans++;
continue;
}
if(d == 1)//xy同类
{
if(isSame(x,y+n) || isSame(x,y+2*n)) ans++;
else{
unite(x,y);unite(x+n,y+n);unite(x+2*n,y+2*n);
}
}
else if(d == 2)//x吃y
{
if(isSame(x,y) || isSame(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);
return 0;
}