Calculating pre-xors in a Tree (DSU application)
Created | |
---|---|
Tags |
This is related to a problem I came across in OJ 4 (DSA) and the following is the solution:
int n, m, k;
map<int, int> parent, val;
int net = 0, ans = INF;
int power(int x, int N)
{
int y = 1;
while (N > 0)
{
if (N & 1)
y = (y * x) % MOD;
N /= 2;
x = (x * x) % MOD;
}
return y;
}
int Get(int i)
{
if (!parent.count(i)) parent[i] = i, val[i] = 0;
return parent[i];
}
int Find(int x)
{
int p = Get(x);
if (p == x) return x;
int r = (parent[x] = Find(p));
val[x] ^= val[p];
return r;
}
void Union(int i, int j, int x)
{
int a = Find(i), b = Find(j);
x ^= val[i] ^ val[j];
if (a != b)
{
parent[a] = b;
val[a] = x;
net--;
} else
{
if (x == 0) return;
else
ans = 0;
}
}
signed main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cin >> n >> m >> k;
net = n + m - 1;
while (k--)
{
int i, j, x;
cin >> i >> j >> x;
j = 1005 + j;
if (ans != 0)
Union(i, j, x);
}
if (ans == 0)
cout << 0 << endl;
else
{
ans = power(2, 30);
ans = power(ans, net);
cout << ans << endl;
}
return 0;
}