Advanced Data Structures :: Disjoint Set
Description
在一個奇葩世界裏的奇葩環形食物鏈。
按題目給的信息構造出食物鏈,並且找出矛盾的信息數。
Type
Advanced Data Structures :: Disjoint Set
Analysis
一道經典的加權並查集題目,mod 3的。
因爲太經典,也不知道講啥……
就是合併前檢查是否矛盾即可。
不過此題好似有個奇葩,只有一組輸入數據。
如果認爲是多組輸入,以文件結尾來結束程序輸入的話,就會悲劇。
Solution
// POJ 1182
// 食物鏈
// by A Code Rabbit
#include <cstdio>
#include <cstring>
const int MAXN = 50002;
const int MOD = 3;
struct DisjointSet {
int p[MAXN];
int w[MAXN];
void Init(int);
void Make(int x) { p[x] = x; }
int Find(int x) {
if (p[x] == x) return x;
int res = Find(p[x]);
w[x] = (w[x] + w[p[x]]) % MOD;
return p[x] = res;
}
void Union(int x, int y, int d) {
int px = Find(x); int py = Find(y);
p[px] = py;
w[px] = (w[y] - w[x] + d + MOD) % MOD;
}
};
void DisjointSet::Init(int n) {
memset(w, 0, sizeof(w));
for (int i = 0; i < n; i++) Make(i);
}
int n, k;
DisjointSet set;
int main() {
scanf("%d%d", &n, &k);
set.Init(n);
int ans = 0;
for (int i = 0; i < k; i++) {
int d, x, y;
scanf("%d%d%d", &d, &x, &y);
if (x > n || y > n) {
ans++;
continue;
}
int px = set.Find(x - 1);
int py = set.Find(y - 1);
if (px == py) {
if (d == 1 && set.w[x - 1] != set.w[y - 1])
ans++;
else if (d == 2 && (set.w[x - 1] - set.w[y - 1] + MOD) % MOD != 1)
ans++;
} else {
if (d == 1)
set.Union(x - 1, y - 1, 0);
if (d == 2)
set.Union(x - 1, y - 1, 1);
}
}
printf("%d\n", ans);
return 0;
}