扩域并查集
1 #包含输入输出流
2 #包含cstdio
3使用命名空间标准;
四
5 const int MAXN=50010
6 int n,k;
7 int head[MAXN * 3];//一倍存同类,一倍存吃,一倍存被吃
8
9 int root(int x)
10 {
11 if (x==head[x])返回x;
还有12个返回head[x]=root(head[x]);
13 }
14
15行内bool check1(int x,int y) //同类
16 {
17 if(根(x ^ n)==根(y)| |根(x ^ 2 * n)==根(y))返回false//x吃y || x被y吃
18头[根(x)]=根(y);
19头【根(x ^ n)】=根(^恩);
20头[根(x ^ 2 * n)]=根(y ^ 2 * n);
21还真;
22 }
23行内bool check2(int x,int y) //x吃y
24 {
25 if(根(x)==根(y)| |根(x ^ 2 * n)==根(y))返回false//同类|| x被y吃
26头[根(x)]=根(y ^ 2 * n);
27头[根(x ^ n)]=根(y);
28头[根(x ^ 2 * n)]=根(^恩);
29还真;
30 }
31
32 int main()
33 {
34 scanf('%d%d ',n,k);
35表示(int I=1;I=3 * n;I)头[I]=I;
36
37 int ans=0;
38表示(int I=1;I=k;(一)
39 {
40 int opt,x,y;
41 scanf('%d%d%d ',opt,x,y);
42 if (xn || yn)
43 {
44 ans
45继续;
46 }
47 if (opt==1) //x与y是同类
48 {
49如果(!check1(x,y))ans;
50 }
51 else //x吃y
52 {
53 if (x==y)
54 {
55 ans
56继续;
57 }
58 if(!check2(x,y))ans;
59 }
60 }
61 printf('%d\n ',ans);
62
63返回0;
64 }
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/52950.html