随笔分类 -  算法入门经典第二版第十一章 图论模型与算法

摘要:从终点逆推,d[u]表示进入u以后剩下的货物,那么进入u之前的货物数量设为y,d[u] = x,那么y-x=ceil(y/20.0)=(y-1)/20+1=(y+19)/20。(y-x)*20+r=y+19,0≤r≤19,即19*y=20*x+r,根据题意y应该尽量小,x的部分是不能变动的,所以y=... 阅读全文
posted @ 2015-09-03 21:41 陈瑞宇 阅读(226) 评论(0) 推荐(0) 编辑
摘要:题目只有一条路径会发生改变。常见的思路,预处理出S和T的两个单源最短路,然后枚举商业线,商业线两端一定是选择到s和t的最短路。路径输出可以在求最短路的同时保存pa数组得到一棵最短路树,也可以用dist数组检查。#includeusing namespace std;const int maxn = ... 阅读全文
posted @ 2015-09-02 10:20 陈瑞宇 阅读(234) 评论(0) 推荐(0) 编辑
摘要:用布尔变量表示状态,把限制条件转化为XνY的形式以后跑2SAT,根据变量取值输出方案。#includeusing namespace std;const int maxn = 1e5+5;#define PB push_backbool vis[maxn*2];vector G[maxn*2];in... 阅读全文
posted @ 2015-09-02 08:37 陈瑞宇 阅读(176) 评论(0) 推荐(0) 编辑
摘要:补题,逆序考虑每个询问的时间,这样每次就变成出现新岛屿,然后用并查集合并统计。fa = -1表示没出现。以前写过,但是几乎忘了,而且以前写得好丑的,虽然常数比较小,现在重新写练练手。每个单词后面都要加空格不然PE#includeusing namespace std;const int maxn =... 阅读全文
posted @ 2015-09-01 19:45 陈瑞宇 阅读(355) 评论(0) 推荐(0) 编辑
摘要:题意:在一颗树上要求一个到其他结点容量和最大的点,i,j之前的容量定义为i到j的路径上的最小边容量。一开始想过由小到大的去分割边,但是很难实现,其实换个顺序就很容易做了,类似kruskal的一个贪心算法,从大到小的连边,每次连通两个分量A和B,这样可以新边容量一定是两个分量相互到达的最小容量,其余边... 阅读全文
posted @ 2015-09-01 18:05 陈瑞宇 阅读(409) 评论(0) 推荐(0) 编辑
摘要:题意比较坑,移动完以后的士兵不能再次移动,不然样例都过不了。。。最小值最大满足决策单调性所以二分答案,跑网络流验证是否可行。这种题重点在建图,为了保证只移动一次,拆点,一个入点一个出点,到了出点的自然不能再次调度。不在边界上的边连一条容量为1的边表示至少留一个人,在边界上的与T的连边就设置成mid。... 阅读全文
posted @ 2015-09-01 12:57 陈瑞宇 阅读(295) 评论(0) 推荐(0) 编辑
摘要:这道题挺像hdu 5093 Battle ships的,不过那道题是要求最多放置的点数,而这道题是要求最小点覆盖。顶点覆盖的定义是:在G中任意边至少有一个端点属于顶点集合S。一个重要的位置有(x,y)两个坐标,而要守住这个这个位置就是相当于连了一条边x到y的边。选了一个(x,y)就相当于选了所有相同... 阅读全文
posted @ 2015-08-30 10:31 陈瑞宇 阅读(620) 评论(3) 推荐(0) 编辑
摘要:模版集合个数减少是因为匹配串集合中没被匹配过的一对串匹配了。所以就是找一个二分图最大匹配。因为集合X和Y是不好分开的,但是可以直接跑,两个集合都会跑一遍,所以一个匹配会被算两次,返回的时候除以2就行了。也有另外一种写法不用除以2的。#includeusing namespace std;const ... 阅读全文
posted @ 2015-08-29 21:08 陈瑞宇 阅读(572) 评论(1) 推荐(0) 编辑
摘要:最短路问题,不过起点不只是1个,终点也不止1个,因此把不同电梯的楼层分别编号,相邻楼层之间连边,不同电梯的相同楼层之间连边。dij的时候一次性把所有起点压到队列中,如果直接套版可以加一超级源点s和所有起点连一条dist为0的边。需要维护的信息:为了判断之前电梯有没有出现相同楼层,需要维护一个楼层到点... 阅读全文
posted @ 2015-08-29 18:13 陈瑞宇 阅读(223) 评论(0) 推荐(0) 编辑
摘要:题意:给出一个后缀表达式f(x),最多出现一次x,解方程f(x) = 0。读取的时候用一个栈保存之前的结点,可以得到一颗二叉树,标记出现'X'的路径,先把没有出现'X'的子树算完,由于读取建树的时候是由底向上的,这步可以在读取的时候顺带完成。注意'X'或'1/x'在某个结点和'0'相乘,那么'X'等... 阅读全文
posted @ 2015-08-29 14:50 陈瑞宇 阅读(690) 评论(2) 推荐(0) 编辑
摘要:题意:求一个无向图的点连通度。把一个点拆成一个入点和一个出点,之间连一条容量为1的有向边,表示能被用一次。最大流求最小割即可。一些细节的东西:1.源点固定,汇点要枚举一遍,因为最小割割断以后会形成连通分量,在分割以后那个连通分量里的割会更大。2.每次枚举重建一下图。3.从入点进,出点出,才认为是经过... 阅读全文
posted @ 2015-08-28 22:28 陈瑞宇 阅读(728) 评论(1) 推荐(0) 编辑
摘要:求所有点直接的平均最短距离,保存一下出现过的点,题目保证是所有点连通,Floyd求出最短路以后两个for统计一下。#includeusing namespace std;const int maxn = 101;int g[maxn][maxn];bool vis[maxn];vector p;co... 阅读全文
posted @ 2015-08-28 22:27 陈瑞宇 阅读(443) 评论(0) 推荐(0) 编辑
摘要:如果没有洞,那么任意两点的最短距离就是直线距离,洞里是瞬间的,所以看成一个点就行了(其实点也可以当作半径为0的洞来处理),洞到洞的最短距离都是圆心距离减去半径。剩下的就是求单源最短路径,是完全图,用不加堆优化的dijkstra就行了O(n^2)。#includeusing namespace std... 阅读全文
posted @ 2015-08-28 22:27 陈瑞宇 阅读(519) 评论(0) 推荐(0) 编辑
摘要:题意,有n个匀速动点,求最小生成树的改变次数。一句话总结:动态问题的一般做法是先求出一个静态的解,然后求出解发生改变的事件,事件按照时间排序,依次处理。先求出最开始的最小生成树(MST),当MST中的某条线段v长度被不在MST的线段u取代的时候,最小生成树才会发生变化,具体来说,已经知道之前的MST... 阅读全文
posted @ 2015-08-28 10:26 陈瑞宇 阅读(741) 评论(0) 推荐(1) 编辑
摘要:题意:求混合图的欧拉路径。一句话总结:网络流,最主要在于建图,此题是将出度则是和流量联系在了一起,用最大流来调整边的指向。分析:这题的困难之处在于无向边只能用一次,相当于一个方向未定的有向边。首先用并查集判断图的连通性,(直接计数O(1),做1395 Slim Span学到的技巧)。我们知道有向图的... 阅读全文
posted @ 2015-08-27 20:01 陈瑞宇 阅读(352) 评论(2) 推荐(0) 编辑
摘要:如果不允许转化'#'和'.'的话,那么可以直接在'#'和'.'之间连容量为b的边,把所有'#'和一个源点连接,所有'.'和一个汇点连接,流量不限,那么割就是建围栏(分割'#'和'.')的花费。问题是'#'和'.'是可以转化的,由刚才的思路,可以联想到,当'#'可以转化成'.'的时候,那么就不需要在它... 阅读全文
posted @ 2015-08-26 22:49 陈瑞宇 阅读(1399) 评论(1) 推荐(0) 编辑
摘要:路径的花费和时间有关,路径的开关是周期性的,那么只要计算出当前时间,路径距离关闭还剩下的时间,如果大于t,那么可以通过,否则,只能等到下一次。如果下一次也不能通过,即t>a,这样的边应该在输入的时候忽略。每次只要考虑,到达某个点的最短时间,因为如果等待,解不会更优。#includeusing nam... 阅读全文
posted @ 2015-08-26 17:39 陈瑞宇 阅读(596) 评论(0) 推荐(0) 编辑
摘要:恰好属于一个圈,那等价与每个点有唯一的前驱和后继,这让人想到了二分图,把一个点拆开,点的前驱作为S集和点的后继作为T集,然后连边,跑二分图最小权完美匹配。写的费用流。。最大权完美匹配KM算法没看懂#includeusing namespace std;const int maxn = 200+6;s... 阅读全文
posted @ 2015-08-26 16:35 陈瑞宇 阅读(284) 评论(0) 推荐(0) 编辑
摘要:Floyd的变形,本质是动态规划,路径分成的两个部分中取最大值作为该路径的答案,在所有可行路径之中选一个最小值。#includeusing namespace std;const int maxn = 101;int d[maxn][maxn];const int INF = 0x3f3f3f3f;... 阅读全文
posted @ 2015-08-26 15:12 陈瑞宇 阅读(164) 评论(0) 推荐(0) 编辑
摘要:最短路对应费用,路径数量对应流量。为限制点经过次数,拆点为边。跑一次流量为2的最小费用最大流。最小费用最大流和最大流EK算法是十分相似的,只是把找增广路的部分换成了求费用的最短路。#includeusing namespace std;typedef long long ll;const int m... 阅读全文
posted @ 2015-08-26 15:12 陈瑞宇 阅读(172) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示