图解合并的时候
代码如下
#include <iostream>
using namespace std;
const int N = 2e5 + 10;
int p[N], dist[N]; //并查集数组 距离数组
int find(int x){
if(x != p[x])
{
int f = p[x]; //保存父节点
p[x] = find(p[x]); //寻找根节点, 更新父节点的距离
dist[x] += dist[f]; //加上父节点的距离
}
return p[x];
}
void solve()
{
int n, m;
while(cin >> n >> m)
{
for(int i = 0; i <= n; ++i)
{
p[i] = i;
dist[i] = 0;
}
int ans = 0;
while(m--)
{
int x, y, val;
cin >> x >> y >> val;
--x;
int p1 = find(x), p2 = find(y);
if(p1 == p2)
{
if((dist[y] - dist[x]) != val)
++ans;
}
else
{
p[p2] = p1; //x ->p2-> y
dist[p2] = val + dist[x] - dist[y];
}
}
cout << ans << '\n';
}
}
int main()
{
#ifdef LOCAL
freopen("in.txt", "r", stdin);
#endif
solve();
return 0;
}