题意:
中文题面。
思路:
因为是环形关系,所以每个就用3个关系表示:
(x,y) (x+n,y+n) (x+2*n,y+2*n) 表示同类
(x,y+n) (x+n,y+2*n) (x+2*n,y+n) 表示x吃y
其余的,判断一个有无矛盾就行了。
坑:
无。。。。
代码:
1 #include <stdio.h> 2 #include <string.h> 3 4 const int N = 50005; 5 6 int par[N * 3]; 7 int ran[N * 3]; 8 9 void init(int n) 10 { 11 for (int i = 0;i <= n * 3;i++) 12 { 13 par[i] = i; 14 ran[i] = 0; 15 } 16 } 17 18 int fin(int x) 19 { 20 if (x == par[x]) return x; 21 else return par[x] = fin(par[x]); 22 } 23 24 void unit(int x,int y) 25 { 26 x = fin(x); 27 y = fin(y); 28 29 if (x == y) return; 30 31 if (ran[x] < ran[y]) par[x] = y; 32 else 33 { 34 par[y] = x; 35 if (ran[x] == ran[y]) ran[x]++; 36 } 37 } 38 39 int main() 40 { 41 int n,k; 42 43 scanf("%d%d",&n,&k); 44 45 init(n); 46 47 int ans = 0; 48 49 for (int i = 0;i < k;i++) 50 { 51 int op,x,y; 52 53 scanf("%d%d%d",&op,&x,&y); 54 55 if (x > n || y > n) 56 { 57 ans++; 58 continue; 59 } 60 61 if (op == 1) 62 { 63 if (fin(x) == fin(y+n) || fin(x+n) == fin(y)) ans++; 64 else 65 { 66 unit(x,y); 67 unit(x+n,y+n); 68 unit(x+2*n,y+2*n); 69 } 70 } 71 72 if (op == 2) 73 { 74 if (x == y) ans++; 75 else if (fin(x) == fin(y) || fin(y) == fin(x+n)) ans++; 76 else 77 { 78 unit(x,y+n); 79 unit(x+n,y+2*n); 80 unit(x+2*n,y); 81 } 82 } 83 } 84 85 printf("%d ",ans); 86 87 return 0; 88 }