题目链接
题目大意
有一个长度为n的数组,给出m条信息,每条信息给出的是l,r之间的和,问你有多少条信息是错误的。
一条信息被判为错误是和之前的正确信息相冲突。
解题思路
我们可以用带权并查集来做这个题
题中给的信息是l,r之间的和为v,那么可以转化为 r 这点比 l-1 这个点大v。
检查冲突就好了
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int N=200005;
int fa[N],rela[N],n,m;
void init()
{
for(int i=0; i<=n; i++)
{
fa[i]=i;
rela[i]=0;
}
}
int findd(int x)
{
if(x==fa[x])
return x;
else
{
int a=fa[x];
fa[x]=findd(fa[x]);
rela[x]=rela[x]+rela[a];
return fa[x];
}
}
int check(int x,int y,int z)
{
if(findd(x)==findd(y))
{
int re=rela[x]-rela[y];
return re==z;
}
return 1;
}
void me(int x,int y,int z)
{
int t1=findd(x);
int t2=findd(y);
if(t1!=t2)
{
fa[t1]=t2;
rela[t1]=rela[y]-rela[x]+z;
}
}
int main()
{
while(~scanf("%d %d",&n,&m))
{
init();
int x,y,z;
int ans=0;
for(int i=1; i<=m; i++)
{
scanf("%d %d %d",&x,&y,&z);
x--;
if(check(x,y,z))
me(x,y,z);
else
ans++;
}
printf("%d\n",ans);
}
return 0;
}