UVa 11690

来源:互联网 发布:知乎 平面设计提高 编辑:程序博客网 时间:2024/06/03 03:44

题目:一些人去旅游,结束后他们有些人之间的关系变得恶劣了,而他们付的钱并没有完全的均分;

            现在问保持友好关系的人之间的钱能否完全均化掉。

分析:并查集,数据结构。将还保持友好关系的人构建并查集,判断每个集合的人们是否债务和为零。

说明:还是要学英语,其他都是浮云。

#include <stdio.h>#include <stdlib.h>#include <string.h>//union_set__begein#define MAX_UNION_ITEM_SIZE 10001int  union_sets[10001];int  union_rank[10001];int  union_sums[10001];void union_initial(int s, int t) {for (int i = s ; i <= t; ++ i) {union_sets[i] = i;union_rank[i] = 0;union_sums[i] = 1;}}int union_union(int a, int b) {if (union_rank[a] > union_rank[b]) {union_sets[b] = a;union_sums[a] += union_sums[b];return union_sums[a];}else {union_sets[a] = b;if (union_rank[a] == union_rank[b])union_rank[b] ++;union_sums[b] += union_sums[a];return union_sums[b];}}int union_find(int a) {if (a != union_sets[a])union_sets[a] = union_find(union_sets[a]);return union_sets[a];}//union_set__endint main(){int N, n, m, x, y;while (~scanf("%d", &N)) while (N --) {scanf("%d%d", &n, &m);union_initial(0, n-1);for (int i = 0; i < n; ++ i) {scanf("%d", &union_sums[i]);}for (int i = 0; i < m; ++ i) {scanf("%d%d", &x, &y);int A = union_find(x);int B = union_find(y);if (A != B) {union_union(A, B);}}int flag = 0;for (int i = 0; i < n; ++ i) {int s = union_find(i);if (union_sums[s]) {flag = 1;break;}}if (flag) {puts("IMPOSSIBLE");}else {puts("POSSIBLE");}}return 0;}