bzoj1202 [HNOI2005]狡猾的商人
并查集
听说有人用差分约束做,我哪天也去试一试
并查集维护后缀和,从前往后合并
注意路径压缩的时候要修改后缀和
1 #include<algorithm> 2 #include<iostream> 3 #include<cstdlib> 4 #include<cstring> 5 #include<cstdio> 6 #include<string> 7 #include<cmath> 8 #include<ctime> 9 #include<queue> 10 #include<stack> 11 #include<map> 12 #include<set> 13 #define rre(i,r,l) for(int i=(r);i>=(l);i--) 14 #define re(i,l,r) for(int i=(l);i<=(r);i++) 15 #define Clear(a,b) memset(a,b,sizeof(a)) 16 #define inout(x) printf("%d",(x)) 17 #define douin(x) scanf("%lf",&x) 18 #define strin(x) scanf("%s",(x)) 19 #define LLin(x) scanf("%lld",&x) 20 #define op operator 21 #define CSC main 22 typedef unsigned long long ULL; 23 typedef const int cint; 24 typedef long long LL; 25 using namespace std; 26 void inin(int &ret) 27 { 28 ret=0;int f=0;char ch=getchar(); 29 while(ch<'0'||ch>'9'){if(ch=='-')f=1;ch=getchar();} 30 while(ch>='0'&&ch<='9')ret*=10,ret+=ch-'0',ch=getchar(); 31 ret=f?-ret:ret; 32 } 33 int t,v[111],n,m; 34 int fa[111]; 35 int find(int x) 36 { 37 if(fa[x]==x)return x; 38 int t=find(fa[x]); 39 v[x]+=v[fa[x]]; 40 fa[x]=t; 41 return t; 42 } 43 bool pd(int x,int y,int ww) 44 { 45 int q=find(x),w=find(y); 46 if(q==w)return v[y]-v[x]==ww; 47 fa[q]=w; 48 v[q]=v[y]-v[x]-ww; 49 return 1; 50 } 51 int CSC() 52 { 53 inin(t); 54 while(t--) 55 { 56 inin(n),inin(m);Clear(v,0); 57 int flag=0; 58 re(i,0,n)fa[i]=i; 59 re(i,1,m) 60 { 61 int q,w,e; 62 inin(q),inin(w),inin(e); 63 if(!pd(q-1,w,e))flag=1; 64 } 65 if(flag)cout<<"false\n"; 66 else cout<<"true\n"; 67 } 68 return 0; 69 }