hdu 3038 How Many Answers Are Wrong【带权并查集】

时间:2021-06-12 17:00:46

带权并查集,设f[x]为x的父亲,s[x]为sum[x]-sum[fx],路径压缩的时候记得改s

#include<iostream>
#include<cstdio>
using namespace std;
const int N=200005;
int n,m,s[N],f[N],ans;
int read()
{
int r=0,f=1;
char p=getchar();
while(p>'9'||p<'0')
{
if(p=='-')
f=-1;
p=getchar();
}
while(p>='0'&&p<='9')
{
r=r*10+p-48;
p=getchar();
}
return r*f;
}
int zhao(int x)
{
if(f[x]==x)
return x;
int nw=zhao(f[x]);
s[x]+=s[f[x]];
return f[x]=nw;
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
for(int i=0;i<=n;i++)
f[i]=i,s[i]=0;
ans=0;
while(m--)
{
int x=read()-1,y=read(),z=read(),fx=zhao(x),fy=zhao(y);
if(fx!=fy)
{
f[fy]=fx;
s[fy]=s[x]-s[y]+z;
}
else if(s[y]-s[x]!=z)
ans++;
}
printf("%d\n",ans);
}
return 0;
}