题目
思路:由于题意将所有的动物分为了三个区域:A——>B,B——>C,C——A,所以可以将所有的动物分为三个区域:A(x:同类域)、B(x+n:天敌域)、C(x+n+n:捕食域)。
假的情况:如果x,y是同类,但是x的捕食域有y,那么错误
如果x,y是同类,但是x的天敌域有y,那么错误
如果x是y的天敌,但是x的同类域中有y,那么错误
如果x是y的天敌,但是x的天敌域中有y,那么错误
package 练习;
import java.util.*;
import java.io.*;
import java.lang.*;
import java.util.*;
public class Main {
static Scanner scanner=new Scanner(System.in);
static int a[]=new int [200000];
static int n,m,k,x,y,ans;
public static void main(String[] args) {
n=scanner.nextInt();
m=scanner.nextInt();
for(int i=1;i<=3*n;i++) {//三个区域
a[i]=i;
}
for(int i=0;i<m;i++) {
k=scanner.nextInt();
x=scanner.nextInt();
y=scanner.nextInt();
if(x>n||y>n)ans++;
else if(k==1) {
if(get(x)==get(y+n)||get(x)==get(y+n+n)) {
ans++;
}else {
merge(x, y);
merge(x+n, y+n);
merge(x+n+n, y+n+n);
}
}else {
if(x==y||get(x)==get(y)||get(x)==get(y+n)) {
ans++;
}else {
merge(x, y+n+n);
merge(x+n, y);
merge(x+n+n, y+n);
}
}
}
System.out.println(ans);
}
static int get(int x) {//查找
if (x==a[x]) {
return x;
}
return a[x]=get(a[x]);
}
static void merge(int x,int y) {//合并
a[get(x)]=get(y);
}
}