HDU 3038 How Many Answers Are Wrong
2013-02-07 17:29
344 查看
这题也是看题解的。
A到B之间的和可用k到B的和减去k到A-1的和代替(k<=A-1),并查集检查每一组a,b是否在同一集合里面,若是,则检查是否符合条件,否则,两个数并入一个集合里,sum数组记录的是集合里的每个点到根的和,根必须是集合里面最小的那个数,所以,每次并入必须以数小的那个为根(用最大的数貌似也可,原理相同),并入之后的sum可以画图自己模拟一下就知道怎么算了。
A到B之间的和可用k到B的和减去k到A-1的和代替(k<=A-1),并查集检查每一组a,b是否在同一集合里面,若是,则检查是否符合条件,否则,两个数并入一个集合里,sum数组记录的是集合里的每个点到根的和,根必须是集合里面最小的那个数,所以,每次并入必须以数小的那个为根(用最大的数貌似也可,原理相同),并入之后的sum可以画图自己模拟一下就知道怎么算了。
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <vector> #include <map> #include <queue> #include <ctime> #include <set> #define ll long long #define MP make_pair #define PB push_back #define SZ(x) ((int)(x).size()) #define REP(i,n) for (int i=0; (i)<(int)n; ++(i)) #define FOR(it,c) for ( __typeof((c).begin()) it=(c).begin(); it!=(c).end(); ++it ) using namespace std; const int N=200010; int p ,n,m,sum ; int find(int x){ if(x==p[x]) return x; int t=p[x]; p[x]=find(p[x]); sum[x]+=sum[t]; return p[x]; } int main(){ #ifndef ONLINE_JUDGE freopen("a.in","r",stdin); freopen("a.out","w",stdout); #endif while(cin>>n>>m){ int ans=0; REP(i,n+1) p[i]=i; memset(sum,0,sizeof(sum)); while(m--){ int a,b,c; scanf("%d%d%d",&a,&b,&c); a--; int ta=find(a),tb=find(b); if(ta!=tb){ p[(ta>tb?ta:tb)]=(ta<tb?ta:tb); if(ta<tb) sum[tb]=sum[a]-sum[b]+c; else sum[ta]=sum[b]-sum[a]-c; } else if(sum[b]-sum[a]!=c) 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 3038D - How Many Answers Are Wrong [kuangbin带你飞]专题五 并查集
- 并查集-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 (并查集)(需复习!)
- How Many Answers Are Wrong HDU - 3038
- HDU 3038 How Many Answers Are Wrong
- hdu 3038 How Many Answers Are Wrong (并查集)
- hdu 3038 How Many Answers Are Wrong (带权并查集入门)