您的位置:首页 > 其它

hdu 3038 How Many Answers Are Wrong(并查集)

2015-03-12 15:44 465 查看
题意:

N和M。有N个数。

M个回答:ai, bi, si。代表:sum(ai...bi)=si。如果这个回答和之前的冲突,则这个回答是假的。

问:M个回答中有几个是错误的。

思路:

如果知道sum(ai...bi)=si。假设下一个是sum(ai,ci)=sj。则sum(ai,ci)肯定也知道了。这很符合并查集的结构。

*:画个图。

代码:

int n,m;
int fa[200005];
int sum[200005];

int findFa(int x){
if(fa[x]==x){
return fa[x];
}
int t=fa[x];
fa[x]=findFa(fa[x]);
sum[x]+=sum[t];
return fa[x];
}

int main(){

while(scanf("%d%d",&n,&m)!=EOF){
rep(i,0,n){
fa[i]=i;
sum[i]=0;
}
int ans=0;
while(m--){
int A,B,S;
scanf("%d%d%d",&A,&B,&S);
int fA=findFa(A-1);
int fB=findFa(B);
if(fA!=fB){
fa[fB]=fA;
sum[fB]+=(sum[A-1]+S-sum[B]);
}else{
if(sum[A-1]+S!=sum[B]){
++ans;
}
}
}

printf("%d\n",ans);
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: