1202: [HNOI2005]狡猾的商人
2017-06-24 12:07
302 查看
题目链接
题目大意:有m个条件,对每个条件有a,b,w,表示第a个数到第b个的数的和为w,判断是否存在合法解。
题解:差分约束做法,乱搞做法,带权并查集:用v[i]表示第i+1个月到第f[i]个月的收入,然后搞一搞就好了
我的收获:23333
题目大意:有m个条件,对每个条件有a,b,w,表示第a个数到第b个的数的和为w,判断是否存在合法解。
题解:差分约束做法,乱搞做法,带权并查集:用v[i]表示第i+1个月到第f[i]个月的收入,然后搞一搞就好了
我的收获:23333
#include <cstdio> #include <cstring> #include <cmath> #include <iostream> #include <algorithm> using namespace std; #define M 1010 int n,m,T,w; int f[M],v[M]; string pri[2]={"true","false"}; int fd(int x){ if(f[x]==x) return x; int t=fd(f[x]);//注意要这样写 v[x]+=v[f[x]]; return f[x]=t; } void uniom(int x,int y,int z){ int p=fd(x),q=fd(y); if(p!=q){ f[p]=q; v[p]=v[y]-v[x]-z; } else if(v[y]-v[x]!=z) w=1; } void work() { int x,y,z; for(int i=1;i<=m;i++) { scanf("%d%d%d",&x,&y,&z); if(!w) uniom(x-1,y,z);////题目中是闭区间,改成半开半闭 } cout<<pri[w]<<endl; } void init() { memset(v,0,sizeof(v)); scanf("%d%d",&n,&m); w=0; for(int i=0;i<=n;i++) f[i]=i; } int main() { scanf("%d",&T); while(T--) init(),work(); return 0; }
相关文章推荐
- [bzoj1202][HNOI2005]狡猾的商人
- bzoj1202: [HNOI2005]狡猾的商人
- BZOJ1202 [HNOI2005]狡猾的商人(并查集)
- BZOJ1202: [HNOI2005]狡猾的商人
- bzoj1202:[HNOI2005]狡猾的商人 【并查集】
- 【BZOJ1202】【HNOI2005】狡猾的商人
- 【BZOJ 1202】 [HNOI2005]狡猾的商人
- 【BZOJ1202】【HNOI2005】狡猾的商人(并查集)
- BZOJ1202 [HNOI2005]狡猾的商人 并查集维护前缀和
- [BZOJ1202][HNOI2005]狡猾的商人(并查集+前缀和)
- [BZOJ1202][HNOI2005]狡猾的商人(并查集)
- BZOJ 1202 HNOI2005 狡猾的商人 并查集
- BZOJ 1202: [HNOI2005]狡猾的商人 [带权并查集]
- bzoj1202 [HNOI2005]狡猾的商人
- bzoj 1202: [HNOI2005]狡猾的商人(并查集+前缀和)
- BZOJ——1202: [HNOI2005]狡猾的商人
- 【BZOJ】【1202】【HNOI2005】狡猾的商人
- 1202: [HNOI2005]狡猾的商人 带权并查集
- [BZOJ]1202: [HNOI2005]狡猾的商人 带权并查集
- bzoj1202 [HNOI2005]狡猾的商人