#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int father[111111],disf[111111];
int n,m,t,sum;
int find(int x)
{
int t;
if(x!=father[x])
{
t=find(father[x]);
disf[x]=(disf[x]+disf[father[x]])%300;//更新与根的距离
father[x]=t;
}
return father[x];
}
void solve(int a,int b,int dis)
{
int x,y;
x=find(a);
y=find(b);
if(x==y) //是一个集合则判断距离有没有矛盾
{
if(((disf[a]+300-disf[b])%300)!=dis)
sum++;
}
else//不是一个集合则合并两个集合并算出两个根的距离
{
father[x]=y;
disf[x]=(disf[b]-disf[a]+dis+300)%300;
}
}
int main()
{
int i,j,k,dis,a,b;
while(~scanf("%d%d",&n,&m))
{
sum=0;
memset(disf,0,sizeof(disf));
for(i=1;i<=n;i++)
father[i]=i;
for(i=1;i<=m;i++)
{
scanf("%d%d%d",&a,&b,&dis);
solve(a,b,dis);
}
printf("%d\n",sum);
}
}
hdu 3047 简单的带权并查集
最新推荐文章于 2020-09-23 18:11:56 发布