题意:给定 n 和 m,代表有 n 个数,有 m 次询问,每次给出 a,b,s ,代表 第 a 个数到第 b 个数的和为 s,若 此次询问与之前的产生冲突(即按照前面的询问和不可能为s),则算作错误询问,统计有多少次错误询问;
分析:带权并查集。。
代码:
#include<cstdio>
#include<iostream>
using namespace std;
const int N = 2E5+10;
int fa[N],v[N],ans;
int find(int x){
if(x==fa[x]) return x;
else{
int root=find(fa[x]);
v[x]+=v[fa[x]];
fa[x]=root;
return fa[x];
}
}
void merge(int a,int b,int s){
int x=find(a),y=find(b);
if(x==y){
if(v[b]-v[a]!=s) ans++;
}
else{
fa[y]=x;
v[y]=v[a]+s-v[b];
}
}
int main()
{
int n,m;
while(~scanf("%d%d",&n,&m)){
for(int i=0;i<=n;i++){
fa[i]=i;
v[i]=0;
}
int a,b,s;
ans=0;
while(m--){
scanf("%d%d%d",&a,&b,&s);
merge(a-1,b,s);
}
printf("%d\n",ans);
}
}