题目大意:
给出m个询问,问【l,r】之间的和 ,求出有多少次询问不和之前的矛盾的。
思路分析:
用并查集记录当前节点到根节点的和。
#include <cstdio> #include <iostream> #include <cstring> #include <algorithm> #define maxn 222222 using namespace std; int set[maxn]; int sum[maxn]; int find(int x) { if(x!=set[x]) { int f=set[x]; set[x]=find(set[x]); sum[x]+=sum[f]; } return set[x]; } int main() { int n,m; while(scanf("%d%d",&n,&m)!=EOF) { for(int i=0;i<=n;i++)set[i]=i,sum[i]=0; int ans=0; while(m--) { int l,r,s; scanf("%d%d%d",&l,&r,&s); l--; int xx=find(l); int yy=find(r); if(xx==yy) { if(sum[l]-sum[r]!=s)ans++; } else { set[xx]=yy; sum[xx]=sum[r]-sum[l]+s; } } printf("%d\n",ans); } return 0; }
原文:http://blog.csdn.net/u010709592/article/details/25076507