hdu 3038 并查集
2015-05-08 11:04
267 查看
题意:给出多个区间的和,判断数据矛盾的区间有几个,比方说【1,5】 = 10 ,【6.10】
= 10, 【1, 10】 = 30,这明显第三个与前面两个矛盾。
链接:点我
水题了,val代表到根的和
= 10, 【1, 10】 = 30,这明显第三个与前面两个矛盾。
链接:点我
水题了,val代表到根的和
#include<cstdio> #include<iostream> #include<algorithm> #include<cstring> #include<cmath> #include<queue> #include<map> using namespace std; #define MOD 1000000007 const int INF=0x3f3f3f3f; const double eps=1e-5; typedef long long ll; #define cl(a) memset(a,0,sizeof(a)) #define ts printf("*****\n"); const int MAXN=200010; int n,m,tt; int ans=0; int f[MAXN]; int val[MAXN]; int find(int x) { if(f[x]==-1) return x; int temp=find(f[x]); val[x]+=val[f[x]]; return f[x]=temp; } void bing(int x,int y,int w) { int t1=find(x); int t2=find(y); if(t1!=t2) { f[t2]=t1; val[t2]=val[x]-val[y]+w; } else { if(val[y]-val[x]!=w) { ans++; } } } int main() { int i,j,k; #ifndef ONLINE_JUDGE freopen("1.in","r",stdin); #endif while(scanf("%d%d",&n,&m)!=EOF) { memset(f,-1,sizeof(f)); memset(val,0,sizeof(val)); ans=0; int u,v,w; for(i=0;i<m;i++) { scanf("%d%d%d",&u,&v,&w); u-=1; bing(u,v,w); } printf("%d\n",ans); } }
相关文章推荐
- 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 带权并查集,区间
- 并查集-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 带权并查集
- HDU 3038 带权并查集,区间
- hdu 3038 带权并查集
- 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(并查集好题)
- hdu 3038 How Many Answers Are Wrong(并查集)
- HDU 3038 How Many Answers Are Wrong (并查集)
- hdu 3038 How Many Answers Are Wrong 带权并查集