hdu 3038 (并查集)

2014-11-24 12:34:37 · 作者: · 浏览: 0

题目大意:

给出m个询问,问【l,r】之间的和 ,求出有多少次询问不和之前的矛盾的。

思路分析:

用并查集记录当前节点到根节点的和。

#include 
  
   
#include 
   
     #include 
    
      #include 
     
       #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; }