讨论 / 思路……
wrongnumber 2015-12-11 20:01:01
点我顶贴 收藏 删除
创建2n个新元素……

对于i 创造 i+n 表示一个属于被i吃的种族的元素

创造 i+2n 表示一个属于能吃i的种族的元素

然后裸并查集

#include<iostream>

#include<cstdio>

using namespace std;

int n,k,f[150005],ans;

int find(int i)

{

if (f[i]==i) return i;

else return f[i]=find(f[i]);

}

void merge(int i,int j)

{

int fi=find(i),fj=find(j);

f[fi]=fj;

}

int main()

{

scanf("%d%d",&n,&k);

for (int q=1;q<=n*3+3;q++) f[q]=q;

for (int q=0,e,i,j;q<k;q++)

{

scanf("%d%d%d",&e,&i,&j);

if ((i<1 || j<1 || i>n || j>n)||(e==2 && i==j))

{

ans++;

continue;

}

if (e==1)

{

if (find(i)==find(j+n)||find(i)==find(j+(n<<1)))

{

ans++;

continue;

}

merge(i,j);

merge(i+n,j+n);

merge(i+(n<<1),j+(n<<1));

}

else {

if (find(i)==find(j)||find(i)==find(j+n))

{

ans++;

continue;

}

merge(i,j+(n<<1));

merge(i+n,j);

merge(i+(n<<1),j+n);

}

}

printf("%d",ans);

return 0;

}

#1 cjoier_gjh@2017-01-22 00:54:42
回复 删除
有道理++
#2 cjoier_gjh@2017-01-22 00:54:53
回复 删除
+1-_-
查看更多回复
提交回复