题目大意:
唔。。是个中文题,就不用解释了哈 ~
解题思路:
其实不用纠结搞懂谁是A,谁是B,谁是C。对于每一种动物,都创建三个角色: i - A,i - B,i - C。分别用0~N,N+1~2N,2N+1~3N 表示。
然后对于比如“1 4 6”的情况,就把 4 和 6 连起来,把 4+N 和 6+N 连起来,把4+2N 和6+2N 连起来,连接之前,检查原来的关系;对于“2 4 6”的情况,把 4和6+N,4+N和6+2N,4+2N和6 连起来 ,也要检查一下以前的关系。(如果以前的关系跟现在的关系是反的,就不对,检查比如x - A和y-B或者y-C是否在同一组) 。
参考代码:
(以后还是不要用cin cout了,这里用cin cout 结果TLE,然后改了scanf ,printf就过了。。。)
#include <iostream>
#include <vector>
#include <map>
#include <string>
#include <queue>
#include <stack>
#include <set>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
using namespace std;
const int INF=0x3f3f3f3f;
const int SIZE=50005;
int id[SIZE*4];
int n,m;
int find(int x)
{
if(x!=id[x]) id[x]=find(id[x]);
return id[x];
}
void un(int p,int q)
{
p=find(p);q=find(q);id[p]=q;
}
bool same(int x,int y)
{
return find(x)==find(y);
}
int main()
{
int n,m;
int a,b,c;
scanf("%d%d",&n,&m);
for(int i=1;i<=n*3;i++)
id[i]=i;
int sum=0;
for(int i=0;i<m;i++)
{
scanf("%d%d%d",&a,&b,&c);
if(b>n||c>n) {sum++;continue;}
if(a==1)
{
if(same(b,c+n)||same(b,c+n*2))
sum++;
else
{
un(b,c);
un(b+n,c+n);
un(b+n*2,c+n*2);
}
}
else
{
if(same(b,c)||same(b,c+2*n))
sum++;
else
{
un(b,c+n);
un(b+n,c+n*2);
un(b+n*2,c);
}
}
}
printf("%d\n",sum);
return 0;
}