注意节点与根的关系,用向量来合并
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <string.h>
#include <string>
using namespace std;
const int MAXN = 200000 + 10;
int pre[MAXN], n, m;
long long ranks[MAXN];
void init()
{
memset(ranks, 0, sizeof(ranks));
for (int i = 0; i <= n; i++) pre[i] = i;
}
int finds(int x)
{
if (x == pre[x])
{
return x;
}
int r = finds(pre[x]);
ranks[x] += ranks[pre[x]];
pre[x] = r;
return r;
}
bool is_true(int u, int v, int w)
{
int fa = finds(u), fb = finds(v);
if (fa != fb)
{
pre[fa] = fb;
ranks[fa] = ranks[v] - ranks[u] - w;
return true;
}
else
{
if (ranks[u] != ranks[v] - w)
{
return false;
}
return true;
}
}
void input()
{
int u, v, w;
while (scanf("%d %d", &n, &m) != EOF)
{
int ans = 0;
init();
for (int i = 0; i < m; i++)
{
scanf("%d %d %d", &u, &v, &w);
u--;
if (!is_true(u, v, w))
{
ans++;
}
}
printf("%d\n", ans);
}
}
int main()
{
input();
return 0;
}