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

带权并查集,设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;
}
posted @ 2018-11-16 10:46  lokiii  阅读(112)  评论(0编辑  收藏  举报