扩域并查集

技术扩域并查集 扩域并查集1 #include iostream2 #include cstdio3 using namespace std;4 5 const int MAXN=50010;6 int

扩域并查集

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

(0)

相关推荐