首页 > 代码库 > [POJ1703]Find them, Catch them(并查集)
[POJ1703]Find them, Catch them(并查集)
传送门
1.开两个并查集 f[x] 表示 x 的同类 f[x + n] 表示 x 的敌人
——代码
1 #include <cstdio> 2 #include <iostream> 3 #define N 200001 4 5 int T, n, m; 6 int f[N]; 7 8 inline int read() 9 {10 int x = 0, f = 1;11 char ch = getchar();12 for(; !isdigit(ch); ch = getchar()) if(ch == ‘-‘) f = -1;13 for(; isdigit(ch); ch = getchar()) x = (x << 1) + (x << 3) + ch - ‘0‘;14 return x * f;15 }16 17 inline int find(int x)18 {19 return x == f[x] ? x : f[x] = find(f[x]);20 }21 22 inline void connect(int x, int y)23 {24 x = find(x);25 y = find(y);26 f[x] = y;27 }28 29 int main()30 {31 int i, j, x, y;32 char s[1];33 T = read();34 while(T--)35 {36 n = read();37 m = read();38 for(i = 1; i <= (n << 1); i++) f[i] = i;39 for(i = 1; i <= m; i++)40 {41 scanf("%s", s);42 x = read();43 y = read();44 if(s[0] == ‘A‘)45 {46 if(find(x) == find(y)) puts("In the same gang.");47 else if(find(x) == find(y + n) || find(y) == find(x + n)) puts("In different gangs.");48 else puts("Not sure yet.");49 }50 else51 {52 connect(x, y + n);53 connect(y, x + n);54 }55 }56 }57 }
2.带权并查集
——代码
1 #include <cstdio> 2 #include <iostream> 3 #define N 1000001 4 5 int T, n, m; 6 int f[N], d[N]; 7 8 inline int read() 9 {10 int x = 0, f = 1;11 char ch = getchar();12 for(; !isdigit(ch); ch = getchar()) if(ch == ‘-‘) f = -1;13 for(; isdigit(ch); ch = getchar()) x = (x << 1) + (x << 3) + ch - ‘0‘;14 return x * f;15 }16 17 inline int find(int x)18 {19 if(x ^ f[x])20 {21 int fx = f[x];22 f[x] = find(f[x]);23 d[x] = (d[x] + d[fx]) % 2;24 }25 return f[x];26 }27 28 inline void connect(int x, int y)29 {30 int fx = find(x), fy = find(y);31 d[fx] = (d[y] + 1 - d[x]) % 2;32 f[fx] = f[y];33 }34 35 int main()36 {37 int i, x, y;38 char s[1];39 T = read();40 while(T--)41 {42 n = read();43 m = read();44 for(i = 1; i <= n; i++) f[i] = i, d[i] = 0;45 for(i = 1; i <= m; i++)46 {47 scanf("%s", s);48 x = read();49 y = read();50 if(s[0] == ‘D‘) connect(x, y);51 else52 {53 if(find(x) ^ find(y)) puts("Not sure yet.");54 else if(d[x] == d[y]) puts("In the same gang.");55 else puts("In different gangs.");56 }57 }58 }59 return 0;60 }
[POJ1703]Find them, Catch them(并查集)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。