赞
踩
NOI 2001 食物链(eat)
题解:
总体思想就是把并查集的空间开3倍当作扩展域,然后存3大类东西,同类域,吃域,被吃域。然后用并差距维护即可。
#include <iostream>
#include <cstdio>
using namespace std;
int fa[5000000];
int n,k,d,x,y,ans=0;
int x1,x2,x3,y1,y2,y3;
int find(int x)
{
if(fa[x]==x)
return x;
else
return fa[x]=find(fa[x]);
}
int main()
{
cin>>n>>k;
for(int i=1;i<=k*3;i++)
fa[i]=i;
for(int i=1;i<=k;i++)
{
cin>>d>>x>>y;
if(x>n||y>n) //判断条件2是否符合
{
ans++;
continue;
}
//存3倍扩展域
x1=find(x); //同类
x2=find(x+n); //吃域
x3=find(x+n*2); //被吃域
y1=find(y); //同类
y2=find(y+n); //吃域
y3=find(y+n*2); //被吃域
if(d==1)
{
if(x1==y2||x2==y1) //如果y吃x或x吃y 因为同类不能吃所以为假话
ans++;
else //否则x与y便是同类,即同类域,吃域,被吃域都相同
{
fa[x1]=y1;
fa[x2]=y2;
fa[x3]=y3;
}
}
if(d==2)
{
if(x1==y1||x1==y2) //如果x,y为同类或y吃x所以为假话
ans++;
else //否则x的同类等于y被吃域的x,x的吃域等于y的同类,x的被吃域等于y所吃的z(因为就3类动物)
{
fa[x1]=y3;
fa[x2]=y1;
fa[x3]=y2;
}
}
}
cout<<ans;
return 0;
}
PS:可以自己思考一下3种动物的关系
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。