用并查集维护一下距离就行了
#include <cstdio>
int pa[500010], dis[500010];
int find(int x) {
if(pa[x] == x) return x;
int t = find(pa[x]);
dis[x] += dis[pa[x]];
return pa[x] = t;
}
int main() {
int n, m;
while(~scanf("%d%d", &n, &m)) {
int res = 0;
for(int i = 0; i <= n; i++) pa[i] = i, dis[i] = 0;
for(int i = 0; i < m; i++) {
int a, b, c, paa, pb;
scanf("%d%d%d", &a, &b, &c);
paa = find(a);
pb = find(b);
if(paa == pb) {
if(dis[b] != dis[a] + c) res++;
}
else {
pa[pb] = paa;
dis[pb] = dis[a] + c - dis[b];
}
}
printf("%d\n", res);
}
return 0;
}