随笔分类 - 紫书第十一章 图论
摘要:参考了http://www.bubuko.com/infodetail-1276416.html首先是逆向思维, 向把每条边看作一条路径, 然后再去合并然后我们讨论怎么样合并时最优的我们讨论当前的点u那么首先直观感受, 因为如果要合并一次, 就需要两条边,所以最多可以...
阅读全文
摘要:想了很久, 以为是网络流最大流, 后来建模建不出来, 无奈。后来看了 https://blog.csdn.net/hao_zong_yin/article/details/79441180感觉思路很巧妙。首先题目等价于让每条边经过的次数最多。那么假设一条边点a到点b,...
阅读全文
摘要:这道题要逆向思维反过来从大到小枚举, 就是在矩阵中一点一点加进去数字,这样比较好操作, 如果正着做就要一点一点删除数字, 不好做。我们需要在这个过程中维护联通块的个数, 这里用到了并查集。首先加进去一个数, 联通分量数字先加一, 然后再考虑有没有和其他联通分量相连。从...
阅读全文
摘要:书上写的是UVa 12011, 实际上是 12264参考了https://blog.csdn.net/xl2015190026/article/details/51902823这道题就是求出一种最优的移动士兵的方式, 使得与敌方相邻的阵营中最少的士兵最多因为只能在我方...
阅读全文
摘要:用到了二分图的一些性质, 最大匹配数=最小点覆盖 貌似在白书上有讲还不是很懂, 自己看着别人的博客用网络流写了一遍反正以后学白书应该会系统学二分图的,紫书上没讲深。目前就这样吧。#include#include#include#include#include#defi...
阅读全文
摘要:这道题写了两个多小时……首先讲一下怎么建模我们的目的是让所有点的出度等于入度那么我们可以把点分为两部分, 一部分出度大于入度, 一部分入度大于出度那么显然, 按照书里的思路,将边方向后,就相当于从出度大于入度的运一个流量到入度大于出度的点。紫书 例题 11-13 UV...
阅读全文
摘要:这道题写了好久……在三维空间里面有动的点, 然后求有几次最小生成树。其实很容易发现, 在最小生成树切换的时候,在这个时候一定有两条边相等,而且等一下更大的那条边在最小生成树中,等一下更小的边不在最小生成树中。这样的话过了这个时刻,等一下更小的边就会代替等一下更大的边,...
阅读全文
摘要:这道题要分隔草和洞, 然后刘汝佳就想到了“割”(不知道他怎么想的, 反正我没想到)然后就按照这个思路走, 网络流建模然后求最大流最小割。分成两部分, S和草连, 洞和T连外围的草和S连一条无穷大的弧, 表示不能割, 若原来是洞就改成草然后加上花费。然后非外围的草和S连...
阅读全文
摘要:很奇怪, 看到网上用的都是匈牙利算法求最大基数匹配紫书上压根没讲这个算法, 而是用最大流求的。难道是因为第一个人用匈牙利算法然后其他所有的博客都是看这个博客的吗?很有可能……回归正题。题目中只差一个数字的时候可以匹配, 然后求最少模板数。那么肯定匹配的越多就越少, 也...
阅读全文
摘要:把每个电梯口看作一个节点, 然后计算边的权值的时候处理一下, 就ok了。#include#include#include#include#define REP(i, a, b) for(int i = (a); i rhs.t; }}; vector g[MAXN...
阅读全文
摘要:一开始要符合题目条件, 那么肯定没有任何一个点是孤立的, 也就是说没有点的度数是1所以我就想让度数是1的叶子节点相互连起来。然后WA然后看这哥们的博客https://blog.csdn.net/trote_w/article/details/79504280原来连叶子...
阅读全文
摘要:这道题感觉思路非常巧妙, 我是看了别人的博客才想明白的。这里用到了并查集, 以根节点为中心城市, 然后把边从大到小排序, 每次的当前的边即为容量,因为是目前的最小值, 然后去算总的容量, 每次选容量大的点作为新的根节点, 也就是新的中心城市。细节见代码。#includ...
阅读全文
摘要:这道题改了两天……因为这道题和节点有关, 所以就用拆点法解决节点的容量问题。节点拆成两个点, 连一条弧容量为1, 表示只能经过一次。然后图中的弧容量无限。然后求最小割, 即最大流, 即为答案。固定一个源点, 然后枚举汇点, 然后求最小的最小割就ok了。这里的拆点法连边...
阅读全文
摘要:注意这道题是双向边, 然后直接套模板就ok了。#include#include#include#include#include#define REP(i, a, b) for(int i = (a); i edges;vector g[MAXN];int h[MAX...
阅读全文
摘要:这道题只是在边上做一些文章。这道题起点终点可以看成半径为0的洞, 我是直接加入了洞的数组。边就是两点间的距离减去半径, 如果结果小于0的话, 距离就为0, 距离不能为负然后我看到n只有100, 范围很小, 虽然这道题只是单源最短路,但是Floyd代码比较短, 而又不会...
阅读全文
摘要:水题, Floyd一遍就完了。#include#include#define REP(i, a, b) for(int i = (a); i < (b); i++)using namespace std;const int MAXN = 101;int d[MAXN]...
阅读全文
摘要:这道题主要比较权值的时候要改变一下,其他地方基本一样。比较权值的时候要考虑边的时间与a, b可以设相对于当前边的时间now, 则now = d[u] % (a+b), 也就是当前这个边进行到整个a和b的循环的哪个地方了。然后我们分类讨论。(1)当t >a的时候, 这种...
阅读全文
摘要:二分图网络流做法(1)最大基数匹配。源点到每一个X节点连一条容量为1的弧, 每一个Y节点连一条容量为1的弧, 然后每条有向边连一条弧, 容量为1, 然后跑一遍最大流即可, 最大流即是最大匹配对数(2)最小(大)权完美匹配(每个点都被匹配到)。和最大基数匹配类似, 只是...
阅读全文
摘要:这道题要求每个节点只能经过一次,也就是结点容量为1, 要拆点, 拆成两个点, 中间连一条弧容量为1, 费用为0.因为拆成两个点, 所以要经过原图中的这个节点就要经过拆成的这两个点, 又因为这两个点的边的容量为1, 所以只能经过一次, 就等价于原图中的点只能经过一次。拆...
阅读全文
摘要:这道题的建模真的非常的秀, 非常牛逼。先讲建模过程。源点到每一行连一条弧, 容量为这一行的和减去列数, 然后每一列到汇点连一条弧, 容量为这一列的和减去行数, 然后每一行和列之间连一条弧, 容量为19。然后求最大流, 最后矩阵中每一个元素的值就是其所在列和行所连的弧的...
阅读全文