本文主要是介绍hdu 3038 How Many Answers Are Wrong (带权并查集好题+思维),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
#include<algorithm>
using namespace std;
const int maxn =200006;
int sum[maxn];
int ans=0;
for(int i=0;i<=n;i++){
fa[i]=i;
sum[i]=0;
}
}
if(fa[x]==x)return x;v //如果自己就是根节点,返回,不需要修改
int f=fa[x];
fa[x]=find(f);
sum[x]+=sum[f]; //修改sum[],比如有区间[1,2][3,4]可以合成[1,4],
return fa[x];
}
void mix(int a,int b,int c){
int ffa=find(a);
int ffb=find(b);
if(ffa<ffb){ //如果ffa<ffb,说明a在b的前面,想要将啊a,b所在的区间建立联系,那么就是通过根节点与c的关系进行传递,具体多画画图,注意c的权重是指a->b的是具有符号的向量
fa[ffa]=ffb;
sum[ffa]=sum[b]+c-sum[a];
}else if(ffa>ffb){//同理推一下就行了
fa[ffb]=ffa;
sum[ffb]=sum[a]-sum[b]-c;
}else{ //根节点相同,则a,b的关系已经知道,可以进行判断
if(sum[a]-sum[b]!=c)
ans++;
}
}
int n,m;
while(~scanf("%d%d",&n,&m)){
init(n);
ans=0;
while(m--){
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
b++;
mix(a,b,c);
}
printf("%d\n",ans);
}
}
https://www.cnblogs.com/QAQorz/p/9041743.html
这篇关于hdu 3038 How Many Answers Are Wrong (带权并查集好题+思维)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!