![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
ACM_图论
文章平均质量分 78
Nero___
这个作者很懒,什么都没留下…
展开
-
SGU 101 Domino
题意: 给出n块多米诺骨牌,每块骨牌的左右端点有标号(0~6),现要求把给定的骨牌排成一排,要求相邻骨牌的相邻端点标号相等。按顺序输出摆放好的骨牌和它们是否翻转过。解法: 以0~6为点,骨牌为边,找欧拉通路。DFS即可。#include #include #include using namespace std;#define REP(i,a,b) for(int i=(a); i原创 2013-08-17 16:52:37 · 1094 阅读 · 0 评论 -
POJ 3241 Object Clustering (曼哈顿距离最小生成树)
题意: 询问平面上的点的曼哈顿距离最小生成树第n-k小边的长度,点数为10000。解法:对于曼哈顿距离最小生成树,朴素的解法需要建n^2条边进行kruskal,显然要TLE。2010莫涛论文中提到了一个可以将边优化到8*n条的方法,其实就是利用了一个性质:以任意一个点为端点将平面分成均匀45度角的8个块,那么在生成树的最优解中,每个块与这个点至多有1条边,即一个点最多向8个方向最近的点各连接一原创 2013-11-04 17:35:49 · 1012 阅读 · 0 评论 -
HDU 4126 Genghis Khan the Conqueror (生成树,并查集)
题意: 给出一幅3000个点的图,有10000次操作: 求将某条边的权值变大后的最小生成树,最后输出10000次操作得到的最小生成树权值的平均值。解法: 首先,对于一棵最小生成树,如果我们将它的某条边增大,那么存在一棵新的最小生成树与原生成树只有一条边是不同的,并且这条边与那条增大边在同一个环里,并且是与这条增大边同环的原最小非树边。证明如下: 由最小生成树的定义,最小生成树是一棵具有原创 2013-11-09 20:55:39 · 924 阅读 · 0 评论 -
最大流模板
POJ1273 Drainage Ditches(网络最大流裸题)ISAP + 邻接矩阵// Nero// 邻接矩阵#include #include #include using namespace std;#define FOR(i,a,b) for(int i=(a); i<=(b); i++)#define REP(i,a,b) for(int i=(a)原创 2013-08-09 13:50:03 · 824 阅读 · 0 评论 -
POJ 1459 Power Network
题意: 裸裸的最大流,认真看完题意你就输了。解法: ISAP。手敲的一份ISAP,存稿。#include #include #include #include using namespace std;const int MAXN=110;const int INF = ~0u>>2;#define clr(a,b) memset(a,b,sizeof(a))#defi原创 2013-08-11 09:42:58 · 723 阅读 · 0 评论 -
POJ 3728 The merchant (Tarjan LCA)
题意:给出一棵树,有点权,5W次询问从a走到b交易一件物品能获得的最大利润(即在某个节点买入一件物品,在后面的节点卖出)。正确理解题意花了一天多,泪奔。解法:设a,b的LCA为c,则答案来自a->c,c->b,或者在ac段买入在cb段卖出。容易想到信息是可以合并的,那么不妨在Tarjan用并查集求出一个询问的LCA后,顺便用并查集把路径的信息合并。TarjanLCA求lca(a,b原创 2014-01-18 20:45:10 · 928 阅读 · 2 评论 -
CF280D k-Maximum Subsequence Sum (线段树)
10W个数10W个操作,操作有两种:修改单点的值;从区间[L,R]中选出最多k段不相交区间,使和最大。k最大为20用dp思路时间复杂度O(mk^2lgn) == TLE。so,会有其他方法。如果用费用流解决k段区间最大和,那么找增广路的过程是怎么样的呢。step 1,找到一条费用最大的增广路Lstep 2,若找不到增广路,或L已经是负费用了,goto step 4,否则原创 2014-02-09 22:29:09 · 1585 阅读 · 0 评论 -
二分图König定理的网络流思路证明
本篇尝试从网络流构图上证明König定理,个人理解,仅作参考,不喜勿喷König定理:二分图的最小点覆盖等于原图最大匹配首先,你得知道网络流,然后,你得知道最大流等于最小割,然后我们就可以开始了用网络流解决二分图最大匹配的思路:二分图最大匹配可以解释为,从原图中选择尽量多的相邻顶点对,每个顶点最多只能被选择一次因此在网络流中的建图就是这样:源向左侧点连容量为1的边,原创 2014-03-04 19:44:03 · 2019 阅读 · 4 评论 -
网络流学习笔记
HDU 1532 Drainage Ditches 网络流模板题HDU 3549 Flow Problem网络流模板题HDU 3572 Task Schedule任务分配可行性问题。观察知:1:m台机器是不区分的。2:对于每个时刻,至多允许m个任务运行。3:每个任务的[bg,ed]区间,只要被运行p次,该任务就完成了。so:对时间建点,原创 2014-01-22 15:22:07 · 1858 阅读 · 0 评论 -
Codeforces398D Instant Messanger
题目链接是的真相就是耍流氓暴力!!!离线处理处理出每个点的点度deg[i](无重边)维护一个数组from_small[i],表示与i相邻的点中点度比deg[i]小的点的在线数量然后对于每个询问,暴力数出i的相邻点中点度比deg[i]大的点在线的数量,然后加上from_small[i],就是答案复杂度是O(操作数*sqrt(点度之和))证明:每次询问的复杂度为原创 2014-03-18 23:40:43 · 1454 阅读 · 0 评论 -
TLE君的强连通日记
TLE君的强连通日记HDU1269 迷宫城堡判断是不是强连通图。数据超级水,事实上随便写个dfs就能过了HDU2767 Proving Equivalences添加最少数量的有向边把原图变成强连通图这道题靠dfs果然已经水不过去了,于是只好老老实实学了一下tarjan (其实tarjan的精髓就是如何用栈?)先tarjan把强连通分量缩点,得到有向无环图原创 2014-03-18 21:05:05 · 2555 阅读 · 0 评论 -
POJ 2446 Chessboard (匈牙利算法)
匈牙利算法求解二分图最大匹配题意: 在一个32*32的棋盘上放置1*2的积木,有的格子不能放。问在积木不重叠的情况下能不能将棋盘放满(即没有空格)。解法: 对于棋盘放置积木的问题,倘若数据范围小于20的话是可以用状态压缩DP轻松过去的,但是数据范围到了32的话,并且也没有要求计算放满棋盘的方法数,那么状态压缩就是没有必要并且不可行的了。那么这样考虑:我们需要对每个格子构造两两之间的组合,使原创 2013-09-18 20:10:18 · 838 阅读 · 0 评论 -
POJ 1511 Invitation Cards
题意: 给一副有向图,问源点到其他的距离和其他点到源点的距离之和。解法: 建两幅图,另一幅图的边全部相反,然后用dijkstra求两遍源点到其他点的最短路即可。北大的这题会卡vector,TLE6次后怒改手写邻接表AC- -!!然后是题目说好的权值和不大于1e9,但是但是,不用lld还真心AC不了。。相当的无语啊#include #include #include #in原创 2013-08-02 13:23:52 · 648 阅读 · 0 评论 -
POJ 3228 Gold Transportation
题意: 给出一幅无向图,有些节点有财富,有些节点有仓库。要求把所有财宝运至仓库,使经过的最大边最小。解法: 并查集加Kruskal。将每个节点的财富处理成负值,仓库大小为正值,加起来,然后现在的目的是构成一幅森林,使所有节点的值为非负,并使经过的最大边最小。显然的类似Kruskal的贪心,将边从小到大排序,如果较小边和比它小的边都不能满足要求,那么就考虑往上逐渐加边。好题,但是不难,但原创 2013-08-05 21:11:40 · 777 阅读 · 0 评论 -
POJ 1637 Sightseeing tour
题意: 给一幅连通图,图中同时存在有向边和无向边,问是否为欧拉回路。(混合欧拉回路)解法:明显知: 对于有向边,当把它的方向改变时,它两端的节点一个出入度之差减2,另一个出入度之差加2,不会改变出入度差的奇偶性。对于欧拉回路中的每个节点,它的出度等于入度。我们不妨先把无向边看成有向边,那么我们现在对混合图中的每一条无向边任意选定一个方向,那么图中存在欧拉回路的必要条件是所有点的出入度之差都原创 2013-08-11 16:03:52 · 692 阅读 · 0 评论 -
POJ 1087 A Plug for UNIX
题意: 略。解法: 把插座和源点建边,插座和转换器建边,以需求为边连汇点,求一遍最大流。在ZOJ诡异的PE之后,果断把set换成手写trie树,还是PE。然后在POJ无压力AC了。trie树写的有点弱,没用指针优化,而且固定空间。第二发最大流,还是Frod-Fullkerson#include #include #include #include using names原创 2013-08-08 20:38:23 · 656 阅读 · 0 评论 -
POJ 2513 Colored Sticks
题意:给25W根头尾染色的棍子,问能不能把他们排成一行。要求是相连的棍子相连段的颜色必须相同解法:以颜色为点,棍子为边建图,题目就转化为问这幅图是否为一幅所有点连通的欧拉通路/欧拉回路。因为可能的颜色会有50W种,用map必须超时(而且感觉POJ还卡STL),所以要用到trie。判断所有点连通用并查集。笔者之前不明白为什么欧拉回路也可以,WA了好几发,直到刚才突然想到,把回路的原创 2013-08-07 16:04:09 · 695 阅读 · 0 评论 -
POJ 1392 Ouroboros Snake
AC得很诡异,表示其实自己都没有看懂。难道这就是Fleury算法?#include #include #include using namespace std;#define FOR(i,a,b) for(int i=(a); i<=(b); i++)#define REP(i,a,b) for(int i=(a); i<(b); i++)#define clr(a,b) mem原创 2013-08-07 20:01:50 · 729 阅读 · 0 评论 -
POJ1679 The Unique MST
题意: 问给定的图求最小生成树是否唯一解法: 课本裸题,给权值相同的边作标记,过一遍最小生成树,然后把有使用到的带标记边逐一去掉来检验最小生成树是否唯一Kruskal。#include #include #include using namespace std;typedef __int64 lld;const int INF = ~0u>>1;#define REP(i原创 2013-08-05 21:15:54 · 638 阅读 · 0 评论 -
POJ 1273 Drainage Ditches
题意: 网络最大流裸题。解法: 用Ford-Fulkerson算法写的,邻接矩阵。第一次写网络流,WA了好几发才知道是题目有重边,貌似邻接矩阵要跪的样子。直到遇见一神人博客,意识到可以把重边处理成原边的扩容,ORZ。题目数据水额,O(nmU)复杂度的Ford算法200*200*1e7竟然0ms跑完了。/* Ford-Fulkerson */#include #includ原创 2013-08-08 10:47:10 · 598 阅读 · 0 评论 -
POJ 1062 昂贵的聘礼
题意: 给一副有向图,求节点1的最小值。限制:选择的节点的等级极差小于m思路:在包含节点1的范围内枚举等级的范围(长度为m),然后dijkstra即可。不过m的范围不明确,这个方法给出的真心。。不是很能忍啊,万一给m暴大怎么办?存个模板。。。#include #include #include #include #include #include using原创 2013-07-31 16:08:27 · 581 阅读 · 0 评论 -
POJ 3436 ACM Computer Factory
题意: 略。解法: 左端的全非1与源点连边,右端的全1与汇点连边,所有的点原创 2013-08-11 00:30:17 · 617 阅读 · 0 评论 -
POJ 2391 Ombrophobic Bovines
题意: n块草地上有一定数量的牛,和一定数量牛棚,现在要让所有的牛进入牛棚,问牛的最长最短距离是多少。解法: 将草地拆点,每块草地牛的数量与源点连边,牛棚数与汇点连边,拆开的两个点连一条无穷大的边。用floyd跑一遍求出任意两点的最短距离,然后二分答案,每次重建图,将符合条件的边以容量INF加进容量网络里,跑一遍最大流,如果等于牛总数就更新答案,刷新上界,否则刷新下界。数据比较变态,f原创 2013-08-10 15:15:00 · 647 阅读 · 0 评论 -
POJ 3522 Slim Span
题意: 求最大边与最小边差值最小的生成树解法: 本人写的时候就是枚举最小边构造最小生成树乱搞出来的,后来去查各种网传版本,也确实是这样,传说依据是Kruskal的神贪心,必取最大边的最小值。表示压力略大。#include #include #include using namespace std;const int INF = ~0u>>1;#define REP(i,a,原创 2013-08-05 21:23:23 · 638 阅读 · 0 评论 -
HDU 3313 Key Vertex (bfs)
求从s到t的关键点数量,所谓关键点即是st路径必经之点首先随便找一条st路径(方便起见就st最短路吧),那么关键点肯定不会出现在这条路径之外。然后从s开始bfs,若搜到该路径上的点,不将新点加入队列,并且维护一下s点最远能bfs到的路径上的点是谁那么这个最远点就是割点,并且从s扩展出来的其他点都不是割点然后把这个最远点当做s点,重复上述过程,直到搜到t点为止over弱表示不原创 2014-02-23 22:26:12 · 1015 阅读 · 0 评论