BZOJ


差分约束:

我是谁,差分约束是啥,这是哪

太真实了= =  插个广告:这里有差分约束详(并不)解。

记\(r_i\)为第\(i\)行整体加了多少的权值,\(c_i\)为第\(i\)列整体加了多少权值,那么限制\((i,j),k\)就是\(r_i+c_j=k\)。
这就是差分约束裸题了。\(r_i+c_j=k\Rightarrow r_i-(-c_j)\leq k\ \&\&\ -c_j-r_i\leq -k\)。
注意形式是\(x_j-x_i\leq w\)=v=
建边跑最短路判负环即可。

去洛谷复习以前的板子(忘了怎么写了=-=),发现DFS判负环被卡掉了?太棒啦不用背DFS的代码惹。
乖乖写BFS好了。


带权并查集:
发现这题和BZOJ1202是一模一样的= =。因为全是相等关系,其实是十分特殊的差分约束,可以用带权并查集做。
记\(fa[x]\)表示\(x\)所在集合的根节点,\(dis[x]\)表示\(x\)到\(fa[x]\)的实际距离。
所谓距离是指:对于\(r+c=k\),变成\(r-(-c)=k\),即\(r\)比\(-c\)大\(k\),就在\(r\to -c\)之间连距离为\(k\)的边,同时令\(fa[r]=-c\)。
这样对于一个限制\(r,c,k\),如果\(r,c\)不在同一集合就合并(令较大的数的祖先是较小的数)。在并查集\(Find\)过程中顺便维护一下\(dis\)(具体见代码好惹,注意变量赋值顺序)。
如果\(r,c\)在同一集合,就根据\(dis\)差判一下它俩的距离是否等于\(k\)。

就算\(k\)可能是负的这么做也没什么问题。(废话=v=)


差分约束:

//904kb 48ms
#include <queue>
#include <cstdio>
#include <cctype>
#include <cstring>
#include <algorithm>
#define gc() getchar()
typedef long long LL;
const int N=2005;int Enum,H[N],nxt[N],to[N],len[N],dis[N],dgr[N];
bool vis[N],inq[N];inline int read()
{int now=0,f=1;register char c=gc();for(;!isdigit(c);c=='-'&&(f=-1),c=gc());for(;isdigit(c);now=now*10+c-48,c=gc());return now*f;
}
inline void AE(int u,int v,int w)
{to[++Enum]=v, nxt[Enum]=H[u], H[u]=Enum, len[Enum]=w;
}
bool SPFA(int s,int n)//怎么都直接拿n做总点数的=-= 强迫症表示不行
{std::queue<int> q;q.push(s), dis[s]=0;while(!q.empty()){int x=q.front(); q.pop();inq[x]=0;for(int i=H[x],v; i; i=nxt[i])if(dis[v=to[i]]>dis[x]+len[i]){if(++dgr[v]>n) return 1;dis[v]=dis[x]+len[i], !inq[v]&&(q.push(v),inq[v]=1);}}return 0;
}int main()
{for(int Ts=read(); Ts--; ){int n=read(),m=read(),tot=n+m,cnt=0;Enum=0, memset(H,0,tot+1<<2), memset(vis,0,tot+1);for(int u,v,w,K=read(); K--; ){u=read(),v=read()+n,w=read();AE(v,u,w), AE(u,v,-w);if(!vis[u]) vis[u]=1, ++cnt;if(!vis[v]) vis[v]=1, ++cnt;}memset(dis,0x7f,tot+1<<2), memset(dgr,0,tot+1<<2), memset(inq,0,tot+1);bool fg=1;for(int i=1; i<=tot; ++i)if(vis[i]&&dis[i]==dis[0]&&SPFA(i,cnt)) {fg=0; break;}puts(fg?"Yes":"No");}return 0;
}

带权并查集:

//836kb 20ms
#include <cstdio>
#include <cctype>
#include <assert.h>
#include <algorithm>
#define gc() getchar()
typedef long long LL;
const int N=2005;int fa[N],dis[N];inline int read()
{int now=0,f=1;register char c=gc();for(;!isdigit(c);c=='-'&&(f=-1),c=gc());for(;isdigit(c);now=now*10+c-48,c=gc());return now*f;
}
int Find(int x)
{if(x==fa[x]) return x;int t=fa[x];fa[x]=Find(t), dis[x]+=dis[t];//!!!return fa[x];
}int main()
{for(int Ts=read(); Ts--; ){const int n=read(),m=read(),tot=n+m;for(int i=1; i<=tot; ++i) fa[i]=i, dis[i]=0;bool fg=1;for(int u,v,w,K=read(); K--; ){u=read(),v=read()+n,w=read();if(!fg) continue;int r1=Find(u),r2=Find(v);if(r1!=r2) fa[r1]=r2, dis[r1]=dis[v]+w-dis[u];else if(dis[u]-dis[v]!=w) fg=0;}puts(fg?"Yes":"No");}return 0;
}

转载于:https://www.cnblogs.com/SovietPower/p/10755363.html

BZOJ.4500.矩阵(差分约束 SPFA判负环 / 带权并查集)相关推荐

  1. poj 2049(二分+spfa判负环)

    poj 2049(二分+spfa判负环) 给你一堆字符串,若字符串x的后两个字符和y的前两个字符相连,那么x可向y连边.问字符串环的平均最小值是多少.1 ≤ n ≤ 100000,有多组数据. 首先根 ...

  2. [APIO2017]商旅——分数优化+floyd+SPFA判负环+二分答案

    题目链接: [APIO2017]商旅 枚举任意两个点$(s,t)$,求出在$s$买入一个物品并在$t$卖出的最大收益. 新建一条从$s$到$t$的边,边权为最大收益,长度为原图从$s$到$t$的最短路 ...

  3. dfs版SPFA判负环

    例题 Description 泡泡鱼是一条调皮的鱼,ta的家住在一片珊瑚礁上.在ta的眼里,这些珊瑚礁的形态可以脑补成一个n个节点,m条边的带权图,在海水的腐蚀下,这些珊瑚礁形成了许多的环,ta想考考 ...

  4. POJ 3259 Wormholes SPFA判负环

    思路:SPFA判负环 数组不要开太小-- (后面附一组测试数组) // by SiriusRen #include <queue> #include <cstdio> #inc ...

  5. Codeforces Round #836 (Div. 2) E.Tick, Tock(在线:带权并查集/离线:dfs判环)

    题目 n*m(1<=n,m<=2e5,n*m<=2e5)的网格图, 有一些格子内已经放入了闹钟,当前时刻在[0,h)(1<=h<=1e9)之间 还有一些位置没有放闹钟,输 ...

  6. 2017 西安网络赛A Tree(树上静态查询,带权并查集,矩阵乘法压位,好题)

    题目链接 题意: 给出 \(n(n \leq 3000)\) 个结点的一棵树,树上每个结点有一个 \(64 \times 64\) 的 \(0,1\)矩阵,每个结点上的矩阵是根据输入的 \(seed\ ...

  7. 【2019icpc南京站网络赛 - H】Holy Grail(最短路,spfa判负环)

    题干: As the current heir of a wizarding family with a long history,unfortunately, you find yourself f ...

  8. 天路(01规划+SPFA判负环)

    传送门 公式图片来自洛谷题解 因为求V之和与P之和的比值的最大值.这个值不超过200 考虑到二分答案,设ans为最大值,则有 可以看出是01分数规划 那么每次就重新分配边的权值: ans*ci-vi ...

  9. bzoj 1690: [Usaco2007 Dec]奶牛的旅行——分数规划+spfa判负环

    Description 作为对奶牛们辛勤工作的回报,Farmer John决定带她们去附近的大城市玩一天.旅行的前夜,奶牛们在兴奋地讨论如何最好地享受这难得的闲暇. 很幸运地,奶牛们找到了一张详细的城 ...

最新文章

  1. linux查询重复数据库,Linux如何使用locate命令查找数据搜索数据库
  2. 实战!聊聊如何解决MySQL深分页问题
  3. 第二周 数据分析之展示 Matplotlib库入门
  4. linux复制和剪切命令,Linux命令 复制粘贴剪切
  5. GIT入门笔记(5)- 创建版本库
  6. hadoop博客 oschina
  7. JSTL之数字、日期格式化fmt:formatNumber/、fmt:formatDate/
  8. vue读取服务器文件跨域,新版vue-cli模板下本地开发环境使用node服务器跨域的方法...
  9. 信息学奥赛一本通(2049:【例5.19】字符串判等)
  10. 常用docker管理UI
  11. python 浏览器自动化_Python利用splinter实现浏览器自动化操作方法
  12. Windows8下设置VS默认启动方式为管理员启动
  13. 淘宝双十一最强星秀猫组队人气比拼活动规则和攻略
  14. 2010不断创新的供应链应用模式
  15. jupyter notebook 代码自动补全 加 显示变量功能 以及让3d图片可以旋转
  16. 2021抖音数据报告
  17. Android实现SSH Client
  18. 【回眸】RS485VSRS232,I2C,SPI特点、什么是PMIC、RTOS移植相关问题
  19. 基于C语言的网络编程的项目
  20. 2021 前端 VUE 面试题总汇

热门文章

  1. linux没有检测到触摸板,linux – 制作没有按钮的触摸板,就像带有按...
  2. vector java 复制_Java性能优化必知的40个细节(珍藏版):Jvm调优+MySQL+Tomcat
  3. bzoj 2502: 清理雪道(有下界的最小流)
  4. bzoj 3386 bzoj 3408: [Usaco2009 Oct]Heat Wave 热浪(最短路)
  5. bzoj 2707: [SDOI2012]走迷宫(Trajan+高斯消元+Dp)
  6. bzoj 4568: [Scoi2016]幸运数字(树上倍增+线性基)
  7. C++ STL 程序员必须会之学会删除容器中的元素 带详细注释实例版本
  8. 将图片转化为txt文本显示
  9. Mask-RCNN训练train_shapes.ipynb
  10. 贺利坚老师汇编课程24笔记:内存单元[...]和(...)内容