HDU3038--- How Many AnswersAre Wrong
题意:
A- B之间的和为S,其中0<A<=B<=N,给定一组数据中含有若干个A,B,S。
问多少个是错误的。
题解:
并查集的一类题型:食物链类~~~,带权并查集去做就行~~~。
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<queue>
#include<string>
#include<cstring>
#include<vector>
#include<functional>
#include<utility>
#include<set>
#include<map>
#include<cmath>
#include<stack>
using namespace std;
const int maxn=200005;
int pa[maxn],d[maxn];
int cnt;
int findset(int x)
{
if(pa[x]<0)
{
return x;
}
else
{
int root = findset(pa[x]);
d[x]+=d[pa[x]];
return pa[x]=root;
}
}
void unionset(int x,int y, int l)
{
int rootx = findset(x);
int rooty = findset(y);
if(rootx==rooty)
{
if(d[y]-d[x]!=l)
cnt++;
}
else
{
pa[rooty]=rootx;
d[rooty]=d[x]-d[y]+l;
}
}
int main()
{
int n,m;
while(scanf("%d%d",&n,&m)==2)
{
cnt=0;
for(int i=0;i<n+2;i++)
{
pa[i]=-1;d[i]=0;
}
while(m--)
{ int a,b,c;
scanf("%d%d%d",&a,&b,&c);
unionset(a-1,b,c);
}
cout<<cnt<<endl;
}
}