题意:有n个点,m条信息。每条信息的内容是两个点之间的和的大小。求有多少条信息与上面的信息是矛盾的。
思路:a到b 的大小为s,可以理解为b -(a-1) 为s
#include<cstdio>
#define MAX 200005
int f[MAX];
int v[MAX];//到根节点的距离
int ans;
int finds(int x)
{
if(f[x]==-1)return x;
int tmp=finds(f[x]);
v[x]+=v[f[x]]; // 这里更新该路径上的所有点到根节点的距离
return f[x]=tmp; //压缩路径
}
void unite(int p1,int p2,int w)
{
int t1=finds(p1);
int t2=finds(p2);
if(t1!=t2)
{
f[t2]=t1;
v[t2]=v[p1]-v[p2]+w; //这里的意思是 两个根节点的距离+vp2=vp1+w 要注意方向
// printf("s%d\n",v[t2]);
}
else
{
if(v[p2]-v[p1]!=w)ans++;
}
}
int main()
{
int n,m;
while(scanf("%d%d",&n,&m)!=EOF)
{
ans=0;
for(int i=0;i<=n;i++)
{
f[i]=-1;
v[i]=0;
}
for(int i=0;i<m;i++)
{
int a,b,w;
scanf("%d%d%d",&a,&b,&w);
a--;
unite(a,b,w);
}
printf("%d\n",ans);
}
}