带权并查集
#include <iostream>
#include <cstring>
using namespace std;
int father[50005];
int rank[50005];
int n,m;
int find(int x)
{
if (x == father[x])
return x;
int t = father[x];
father[x] = find(father[x]);
rank[x] = rank[x] + rank[t];
return father[x];
}
void init()
{
memset(rank,0,sizeof(rank));
for (int i=1; i<=n; i++)
father[i] = i;
}
int Union(int a,int b,int s)
{
int x = find(a);
int y = find(b);
if (x == y)
{
if (rank[a]+s != rank[b])
return 0;
else
return 1;
}
father[y] = x;
rank[y] = rank[a]+s-rank[b];
return 1;
}
int main()
{
while (cin>>n>>m)
{
init();
int sum = 0;
for (int i=1; i<=m; i++)
{
int a,b,s;
cin>>a>>b>>s;
if (!Union(a,b,s))
sum++;
}
cout<<sum<<endl;
}
return 0;
}