您的位置:首页 > 其它

HDU 3038 How Many Answers Are Wrong 【神奇并查集】

2017-03-30 16:21 489 查看
点击打开链接

题意:  给你n 表示有个长度为n的序列。

然后有m个计算,a到b 和为s

然后找出其中错误的个数。

题解: 

很不好想这个, 我开始题都没读懂,更别说想到并查集。

那知道了并查集怎么写呢,

首先,已知  a,b,c.的关系,abc 之间的关系都能找到,加上d abcd之间的关系也都能找出,

那么。每给出一个关系,先比较是不是共同祖先, 如果是,那就可以直接比较是否错误,

如果不是,合并即可。

用sum记录合并后的区间和。

#include<bits/stdc++.h>
#include<stdio.h>
#include<string.h>
#define ll long long
const int maxn=2e5+100;

int n,m,a,b,s;
int fa[maxn],sum[maxn];

int Find(int x){
if(fa[x]==x) return x;
int t=fa[x];
fa[x]=Find(fa[x]);
sum[x]+=sum[t];
return fa[x];
}
void Union(int x,int y,int a,int b,int s){
if(x>y){
fa[y]=x;
sum[y]=sum[a]-sum[b]-s;
}else{
fa[x]=y;
sum[x]=sum[b]-sum[a]+s;
}
}
int main(){
while(~scanf("%d %d",&n,&m)){
int wa=0;
for(int i=0;i<=n;++i) fa[i]=i;
memset(sum,0,sizeof(sum));
while(m--){
scanf("%d %d %d",&a,&b,&s);
a--;
int t1=Find(a),t2=Find(b);
if(t1==t2&&sum[a]!=sum[b]+s) wa++;
else if(t1!=t2){
Union(t1,t2,a,b,s);
}
}
printf("%d\n",wa);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: