POJ1703 Find them, Catch them
2012-09-07 09:53
501 查看
原题传送:http://poj.org/problem?id=1703
并查集。
这题更加深了对并查集的理解,以前做过差不多的类似“朋友传递”的题。这道题核心的一句话是:敌人的敌人是朋友。那么假设每个x总有一个敌人(编号为x+n),那么可以把a加入到b的敌人b+n代表的并查集中,把b加入到a的敌人a+n的并查集中。如果find(a)==find(b),那么a和b是同gang;如果find(a)==find(b+n)或者find(b)==find(a+n),那么a和b是不同的gangs;否则,not sure。
View Code
并查集。
这题更加深了对并查集的理解,以前做过差不多的类似“朋友传递”的题。这道题核心的一句话是:敌人的敌人是朋友。那么假设每个x总有一个敌人(编号为x+n),那么可以把a加入到b的敌人b+n代表的并查集中,把b加入到a的敌人a+n的并查集中。如果find(a)==find(b),那么a和b是同gang;如果find(a)==find(b+n)或者find(b)==find(a+n),那么a和b是不同的gangs;否则,not sure。
View Code
#include <iostream> #include <stdio.h> #include <string.h> #define M 100010 using namespace std; int f[M << 1]; int find(int x) { return x == f[x] ? f[x] : f[x] = find(f[x]); } int main() { int T, m, a, b, n; char cmd[3]; scanf("%d", &T); while (T --) { scanf("%d%d", &n, &m); for (int i = 0; i <= 2 * n; i++) f[i] = i; while (m--) { scanf("%s%d%d", cmd, &a, &b); if (cmd[0] == 'D') { f[find(a)] = find(b + n); f[find(b)] = find(a + n); } else { if(find(a) == find(b)) puts("In the same gang."); else if(find(a) == find(b + n) || find(a + n) == find(b)) puts("In different gangs."); else puts("Not sure yet."); } } } return 0; }
相关文章推荐
- Find them, Catch them POJ - 1703(并查集,模板)
- POJ 1703 Find them, Catch them .
- Find them, Catch them POJ - 1703
- poj-1703 Find them, Catch them!! 并查集
- poj 1703 Find them,Catch them
- POJ 1703 Find them, Catch them
- Find them, Catch them poj 1703
- Find them, Catch them POJ - 1703
- POJ1703 Find them, Catch them
- POJ 1703 Find them, Catch them
- poj1703 Find them, Catch them——带权并查集
- 刷题——Find them, Catch them POJ - 1703
- Find them, Catch them poj 1703
- 【poj 1703 Find them, Catch them + 并查集】
- poj-1703 Find them, Catch them ***
- poj-1703 find them,catch them!
- Find them, Catch them POJ - 1703
- 不相交集合 poj 1703 find them catch them
- POJ 1703 Find themCatch them
- POJ 1703 Find them, Catch them