#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <algorithm>
#include <queue>
#define INF 0x3f3f3f3f
#define CSH(a, b) memset(a, (b), sizeof(a))
#define ll long long
using namespace std;
int f[200005],rr[200005];
//hdoj 3038 :给出N个数,m个提问,其中m个提问表示【a,b】的和为s,问有多少个语句是错误的。
int find(int x)
{
if(f[x]!=x)
{
int pre=f[x];
f[x]=find(f[x]);
rr[x]+=rr[pre];//将路径压缩
//a-->b-->c 距离为l1,l2, 则先发现a的上级是b那么,rr[a]=l1,发现b的上级是c,则直接把a-->c,更新rr[a]+=l2;
}
return f[x];
}
int main()
{
int n,m;
while(~scanf("%d%d",&n,&m))
{
CSH(rr,0);
for(int i=0;i<=n;i++)
f[i]=i;
int ans=0;
while(m--)
{
int a,b,s,pa,pb;
scanf("%d%d%d",&a,&b,&s);
a--;//防止a=b的情况,所以进行处理
pa=find(a);
pb=find(b);
if(pa!=pb)//如果a-->pa b-->pb
{
f[pa]=pb; //那就合并 a-->pa-->pb<--b 由向量的思想来看,a到b的距离s=rr[a]+rr[pa]-rr[b];
//由此得出,rr[pa]=s+rr[b]-rr[a];
rr[pa]=s+rr[b]-rr[a];
}
else
{
if(rr[a]-rr[b]!=s)//同上。
ans++;
}
}
printf("%d\n",ans);
}
}
hdu3038带权并查集

最新推荐文章于 2022-05-31 13:14:12 发布