-
How Many Answers Are Wrong
- HDU - 3038
- 经典带权并查:
- 对于A~B之间的和是S,其实可以理解成B比A-1大S
- val记录这个点到它相应最左的和
- fa记录最左端的点
- 如果两个点的左端不同则不会发生冲突 只需把根节点相对在右边的更新val和fa即可
- 若左端点相同则需要判断val[v]-val[u]与w是否相等。
-
#include<bits/stdc++.h> using namespace std; #define maxn 222200 int n,m,ans,u,v,w,a,b; int fa[maxn],val[maxn]; int fond(int x) { if(x==fa[x]) return x; int temp=fond(fa[x]); val[x]+=val[fa[x]]; return fa[x]=temp; } int main() { while(cin>>n>>m) { ans=0; for(int i=0; i<=n; i++) { fa[i]=i; val[i]=0; } while(m--) { cin>>u>>v>>w; u--; a=fond(u); b=fond(v); if(a<b) { fa[b]=a; val[b]=val[u]+w-val[v]; } else if(b<a) { fa[a]=b; val[a]=val[v]-val[u]-w; } else { if(val[v]-val[u]!=w) ans++; } } cout<<ans<<endl; } return 0; }
How Many Answers Are Wrong-带权并查
最新推荐文章于 2024-08-06 14:55:37 发布