题目来源:hdu 3038
写的很好的博客:地址
s
u
m
[
p
x
]
=
s
u
m
[
y
]
+
v
a
l
u
e
−
s
u
m
[
x
]
sum[px] = sum[y] + value - sum[x]
sum[px]=sum[y]+value−sum[x]
#include <iostream>
using namespace std;
const int maxn = 200010;
int n, m;
int father[maxn];
int sum[maxn]; //从当前结点到根节点的和
int ans = 0;
void init()
{
for (int i = 0; i <= n; i++)
{
father[i] = i;
sum[i] = 0;
}
}
int find(int x)
{
if (father[x] == x)
{
return x;
}
else
{
int tf = father[x];
father[x] = find(father[x]);
sum[x] += sum[tf];
return father[x];
}
}
void unite(int x, int y, int value)
{
int faX = find(x);
int faY = find(y);
if (faX != faY)
{
father[faX] = faY;
sum[faX] = sum[y] + value - sum[x];
}
else
{
if (sum[x] - sum[y] != value)
{
ans++;
}
}
}
int main()
{
while (scanf("%d%d", &n, &m) == 2)
{
init();
ans = 0;
int l, r, value;
while (m--)
{
scanf("%d%d%d", &l, &r, &value);
l--;
unite(l, r, value);
}
cout << ans << endl;
}
return 0;
}