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)肯定也知道了。这很符合并查集的结构。
*:画个图。
代码:
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; }
相关文章推荐
- 杭电hdu 3038 how many answers are wrong 并查集求解
- hdu 3038 How Many Answers Are Wrong 带权并查集
- hdu 3038 How Many Answers Are Wrong (带权并查集)
- hdu 3038 - How Many Answers Are Wrong(并查集)
- HDU 3038 How Many Answers Are Wrong (并查集)
- HDU 3038 How Many Answers Are Wrong (带权并查集+区间判断)
- HDU 3038 How Many Answers Are Wrong 带权并查集
- HDU 3038 How Many Answers Are Wrong(带权并查集)
- hdu 3038 How Many Answers Are Wrong(带权并查集+树的性质)
- HDU 3038 How Many Answers Are Wrong 带权并查集
- hdu 3038 How Many Answers Are Wrong(并查集)
- hdu 3038 How Many Answers Are Wrong 带权并查集
- hdu 3038 How Many Answers Are Wrong(带权并查集+树的性质)
- hdu 3038 How Many Answers Are Wrong【并查集的简单应用】
- HDU-3038 How Many Answers Are Wrong 带权并查集
- HDU 3038 How Many Answers Are Wrong (并查集路径压缩)
- HDU 3038 How Many Answers Are Wrong - 并查集
- hdu 3038 How Many Answers Are Wrong(并查集)
- hdu 3038 How Many Answers Are Wrong【并查集的简单应用】
- HDU 3038 How Many Answers Are Wrong 并查集带权路径压缩