UVA10158 - War(并查集)
2015-01-21 15:12
239 查看
UVA10158 - War(并查集)
题目链接
题目大意:有n个国家,每个国家有友国和敌国,并且遵守着朋友的朋友是朋友,敌人的敌人是朋友的原则,给你四种操作,题目中有描述,然后让你根据操作进行,对应输出相应的结果。
解题思路:题目里面有敌对关系和朋友关系,朋友的关系可以使用并查集,但是敌对的关系是不行的。转化敌对的关系。假设0~n - 1,代表国家。n~2 * n - 1 代表0~n - 1这些国家的敌国。例如 1 和 4是敌对关系,因为敌人的敌人是朋友,那么1 + n 和 4 与 1 和4 + n就是朋友的关系,将敌对的关系转换成朋友的关系,然后朋友的关系就可以用并差集了(朋友具有传递的关系)。
代码:
题目链接
题目大意:有n个国家,每个国家有友国和敌国,并且遵守着朋友的朋友是朋友,敌人的敌人是朋友的原则,给你四种操作,题目中有描述,然后让你根据操作进行,对应输出相应的结果。
解题思路:题目里面有敌对关系和朋友关系,朋友的关系可以使用并查集,但是敌对的关系是不行的。转化敌对的关系。假设0~n - 1,代表国家。n~2 * n - 1 代表0~n - 1这些国家的敌国。例如 1 和 4是敌对关系,因为敌人的敌人是朋友,那么1 + n 和 4 与 1 和4 + n就是朋友的关系,将敌对的关系转换成朋友的关系,然后朋友的关系就可以用并差集了(朋友具有传递的关系)。
代码:
#include <cstdio> #include <cstring> const int maxn = 10005; int N; int p[maxn * 2]; void init () { for (int i = 0; i < 2 * N; i++) p[i] = i; } int getParent(int x) { return x == p[x] ? x : p[x] = getParent(p[x]); } bool setfriend (int x, int y) { int x1 = getParent(x); int y1 = getParent(y); int x2 = getParent(x + N); int y2 = getParent(y + N); if (x1 == y2 || y1 == x2) return false; else { p[x1] = y1; p[x2] = y2; return true; } } bool setenemies(int x, int y ) { int x1 = getParent(x); int y1 = getParent(y); int x2 = getParent(x + N); int y2 = getParent(y + N); if (x1 == y1 || y2 == x2) return false; else { p[x1] = y2; p[y1] = x2; return true; } } bool is_friend(int x, int y) { int x1 = getParent(x); int y1 = getParent(y); int x2 = getParent(x + N); int y2 = getParent(y + N); if (x1 == y1) return true; return false; } bool is_enemies(int x, int y) { int x1 = getParent(x); int y1 = getParent(y); int x2 = getParent(x + N); int y2 = getParent(y + N); if (x1 == y2 || x2 == y1) return true; return false; } int main () { int op, x, y; scanf ("%d", &N); init(); while (scanf ("%d%d%d", &op, &x, &y) != EOF && (op || x || y)) { if (op == 1) { if (setfriend(x, y) == false) printf("-1\n"); } else if (op == 2) { if (setenemies(x, y) == false) printf ("-1\n"); } else if (op == 3) printf ("%d\n", is_friend(x, y)); else printf ("%d\n", is_enemies(x, y)); } return 0; }
相关文章推荐
- uva 10158 - War(并查集)
- uva 10158 - War(并查集)
- UVA 10158 War 并查集
- UVA 10158 War (并查集)
- uva10158(War)并查集
- UVA---10158-War(并查集)
- UVa10158 War(并查集)
- UVA 10158 War(并查集)
- (使用树结构来支持并查集变成8.4.3)UVA 10158 War(并查集的经典题目: 敌友关系)
- uva 10158 War(并查集的简单应用)
- UVA - 10158 War 并查集升级版
- War - UVa 10158 并查集
- uva 10158 War (并查集)
- UVA 10158 War(并查集)
- UVa - 10158 - War ( 并查集 )
- UVA 10158 - War(并查集)
- uva 10158(并查集)
- 10158 - War---挑战编程-----并查集应用好题!!!
- UVa 10158 - War
- UVa 10158 War