
ACM_图论
文章平均质量分 74
9974
这个作者很懒,什么都没留下…
展开
-
POJ 2175 spfa费用流消圈
题意:给出n栋房子位置和每栋房子里面的人数,m个避难所位置和每个避难所可容纳人数。然后给出一个方案,判断该方案是否最优,如果不是求出一个更优的方案。思路:很容易想到用最小费用流求出最优时间,在与原方案花费时间对比判断原方案是否最优。也许是组数太多了,这种方法会超时的。 放弃该思路。看看题目没要求要最优解,而是得到一个更优的解。在原图的所有反向边中能够找到一个总费原创 2013-09-09 20:40:24 · 1448 阅读 · 0 评论 -
ZOJ 2588 Burning Bridges 求割边
注意:去掉反向边View Code #include#includestring.h>#includeusing namespace std;#define maxn 10004#define maxm 100055#define inf 1000000000int min(int a, int b){ return a a : b;原创 2013-08-29 10:36:41 · 833 阅读 · 0 评论 -
Codeforces Round #215 (Div. 1)(A,B,C)
这次比赛做得很差,1题垫底,主要A题没考虑len code:https://github.com/9974/Codeforces/tree/master/215div1A 注意len B 问题可以变为 某个序列b与另一个序列a的子序列 rearrang后匹配的个数有几个首先离散化一下,再让sum[i]表示在序列b中每个数的个数,我们再用一个变量cnt表示没有匹配上的个数, 扫一遍序原创 2013-11-27 17:07:30 · 1244 阅读 · 0 评论 -
刘汝佳训练指南《网络流》专题 BY 9974
最近一直在做白书上的网络流, 做得几乎差不多了,在这小小总结一下.已经忽略很水的题。差不多按难度排序了。UVa 11248 增广小优化。UVa 1306(LA 2531) 考察建图UVa 10779 考察建图UVa12125(LA 3972) 有点权,拆点UVa1317(LA2796) 费用流UVa原创 2013-09-11 21:54:08 · 2394 阅读 · 3 评论 -
KM && zkw_flow
今天终于理解了KM顶标的作用, 贴一份O(n^3)的模板。zkw_flow 跟顶标也有点关系,它是把距离dis数组当作顶标,之后在不断给图加可流边,跟把边加入KM相等子图的过程是几乎差不多的。//****************KM 二分图求最大价值//建图(当求最小值时建负权边)#include#include#include#include#includeusing na原创 2013-11-20 18:27:13 · 1339 阅读 · 2 评论 -
UVA 10735 最大流 混合欧拉回路 输出路径
题意:给你一个图,有N个点,M条边,有单向边和双向边让你是否存在欧拉回路,有就输出路径1.判断是否有欧拉回路: 可以用最大流来判断首先,我们从结论出发: 存在欧拉回路的充要条件是 每个点的入度等于出度。先把所用无向边随便定向(我们就按输入的时候的方向定向),问题就转化成 “改变其中一些无向边的方向,使所有的点入度等于出度”。对于改变某一条无向边, 这条边所在原创 2013-07-21 11:13:46 · 1421 阅读 · 0 评论 -
hdu 4056 并查集处理线段树染色问题
这题方法很好,把询问离线倒着处理,当前的染色就一定有效。分析一下全部染完并查集是O(n)的。#include #include #include #include using namespace std;const int maxn = 50005;int n, m, Q;char op[maxn][15];int x[maxn], y[maxn], a[maxn],原创 2013-10-06 18:36:58 · 1893 阅读 · 0 评论 -
ZOJ 1516 二分匹配
题意:给你n*m的土地,有k个1*1的方块被挖掉, 现在你要卖剩下的地(思路:剩下的点按奇偶分成两列点阵(i+j为奇数就是奇点,反之就是偶点)。二分匹配可解#include #include #include #include using namespace std;const int maxn = 55;int n, m, k;bool map[103][103];int原创 2013-09-05 21:37:21 · 1641 阅读 · 0 评论 -
UVA 11594 UVA11603(与hdu4700类似) 点对点的最小割 Gomory-Hu 和Gusfield算法学习
UVA 11594:Gusfield算法题意: 给你n个点的容量网络图(n 算法概述: 原先所有点在一个集合, 每次任选一个集合进行处理, 在集合内任选2个点,求一次最小割s-t,然后用s-t割更新 被这个割所能切割的点对(点对为已经选过的所有点组合出的任意两点之间的点对),直到所有集合中点的个数为1时结束。code在下面UVA 11603: Gomory-Hu算法题原创 2013-09-13 20:30:47 · 2278 阅读 · 0 评论 -
生成树相关问题
做到了好几题关于生成树相关的题目,总结一下,很多题目都是以下的变形。(1)切割性质:(各边边权均不相同)一条边是连接某两个集合的最小边,那么这条边就在最小生成树中(2)回路性质:(各边边权均不相同)图若有回路,那么回路中的最长边一定不在最小生成树中增量最小生成树:(动态加边,对于每条边加入后输出当前最小生成树),根据 “回路性质”复杂度O(n*m)最小瓶颈生成树:(最大边权值尽量小原创 2013-10-14 19:23:44 · 1921 阅读 · 0 评论 -
Codeforces Round #236 (Div. 1)(A, B, C, D)
code链接:https://github.com/9974/Codeforces/tree/master/236div1A样例做法:从1连到n,再从2到n。。。。直到连了2*n+p。。不知道为啥。。能合理解释的做法:显然图平均分布会更好,用优先队列,每次取出度最小的两个点连边即可B先统计题目给你的所有数的总的权值, 预处理每个前缀最大公约数从后往前枚举, 统计一下原创 2014-03-18 17:04:24 · 1392 阅读 · 0 评论 -
The Bangla New Year Contest 2013(2013区域赛练习)
UVA 12610---UVA 12619B,E巨水C简单计算几何,没有秒A,真心弱啊J线段树D字符串G点双联通, 比赛的时候真心2,没出这题,其实很简单,点双联通敲的不多,归根结底就是自己弱Code G:#include #include #include #include #include using namespace std;typedef原创 2013-11-30 21:48:39 · 1488 阅读 · 0 评论 -
hdu 4674 边双连通缩点+倍增lca+麻烦的讨论 (2013多校联合)
题意不用我说了吧,注意题目中说的图是没有环中套环的。这题其实不难,就是烦了点,很容易少考虑情况。我这里是a走到c要经过b的讨论:1.考虑有相同点的情况2.考虑3个点在环内(必定Yes)3.考虑2个点在环内 a,b在环内:如果a是割点就是No,否则Yes (如何判割点,在缩点后的图的边中添加一个信息,然后用LCA就可以了,具体还要细分2种情况)。原创 2013-08-16 18:50:27 · 2281 阅读 · 6 评论 -
hdu 4677 并查集+分块算法 好题 (2013多校联合)
题意:点数n(n ), 边数(m q(1对于每个询问(l, r),去掉(l,r)区间以外的所有点和其相关联的边,问剩下来的图的联通块的个数。思路:分块+并查集分块算法入门:http://blog.youkuaiyun.com/auto_ac/article/details/10050589这题很容易想到分块, 难点是并查集的处理。对询问离线分块排序以后,我们对 左端点在相同块号内的询问原创 2013-08-30 23:01:33 · 2227 阅读 · 0 评论 -
2011-2012 Stanford Local Contest, 8 October, 2011(完全) (2013区域赛练习)
比赛入口 MycodeA 看懂题意以后, 3的k次方为一组找3的k+1次方与它的关系,简单推一下B 可以dp公式,我YY的,答案为2^(2*n-1)*1*3*...*(2*n-1)C n条边有两种情况: 有一个简单环 或者 有一条重边 1.如果有环, 我们用dfs预处理出 dfs第一个搜到的环上的点pos 到环上任意点 的原创 2013-11-12 09:49:39 · 2204 阅读 · 0 评论 -
The 2013 ACM-ICPC Asia Changsha Regional Contest(2013区域赛练习)
链接:http://acm.zju.edu.cn/onlinejudge/showProblems.do?contestId=1&pageNumber=28比赛过了A, C ,G, H, J,KA,J,K被小伙伴秒了,K题比较烦的搜索H题二分就可以了,注意层数是FC题几何题,是我A的,WA了2发,原来少了一种情况,还让队友帮忙检查,真心弱,高中解直角三角形题G题先用havel算原创 2013-11-24 21:08:48 · 1435 阅读 · 2 评论 -
hdu 3686 点双连通 按<割点>缩点 + 倍增lca
题意:给你一幅图,然后询问 从边x到边y要经过几个一定要经过的点。分析:显然,这些点一定是割点。问题就变成 按割边缩点的点双联通 的新图 里面 从 边x所属于的点 到 边y所属于的点 要经过几个割点。注意:如何缩点?把每个联通分量看成一个点(a类点),把所有割点再看成一个点(b类点),然后新图一定是 a类点连b类点,b类点连a类点, 同一类的点不会直接相连,所以我们要求原创 2013-10-07 13:37:12 · 2051 阅读 · 0 评论 -
UVA 10054 无向图的欧拉回路输出路径
无向图其实跟有向图的做法是一样的,一直以为是不一样的,要好好深入学习一下。输出路径方法:dfs,而且用一个栈保存经过的边,然后把栈的边逆顺序输出就是欧拉回路。#include #include #include #include using namespace std;struct edge { int v, vis, next;} edge[1004 << 1];in原创 2013-10-18 22:01:30 · 1416 阅读 · 0 评论 -
hdu 4780 13杭州K题 费用流
这题输入的信息比较多,其实也算一题中等的费用流吧, 看hdu上没什么人做,别被AC数字吓到了。很显然这题是最小费用最大流, 糖果C的数量是流量, 给出的时间是为了建边用的,费用就是题目给出的费用。设S为源点,T为汇点,先构造一排C3点,向T连,控制流出。怎么设置流入是本题的关键,我们抓住机器和糖果的关系,发现机器造第一颗糖果时,选择机器不同费用也是不同,但如果机器造第二颗糖果及以后原创 2013-11-12 15:17:06 · 2980 阅读 · 5 评论 -
POJ 1469 ZOJ1140 二分匹配裸题
很裸,左点阵n,右点阵m 问最大匹配是否为n#include #include #include using namespace std;vector edge[103];int pre[303];bool vis[303];int n, m;bool dfs(int u) { for(int i = 0; i < (int)edge[u].size(); i++) {原创 2013-09-04 23:40:49 · 1286 阅读 · 1 评论 -
ZOJ 1654 二分匹配基础题
题意: 给你一副图, 有草地(*),空地(o)和墙(#),空地上可以放机器人, 机器人向上下左右4个方向开枪(枪不能穿墙),问你在所有机器人都不相互攻击的情况下能放的最多的机器人数。思路:这是一类经典题的衍化,如果没有墙,我们会将行和列看成两列点阵,然后就可以用二分匹配解。现在有墙怎么办呢, 把某一行或列(有墙的拆分成多个区域,可以看成多个行或列), 拆好以后更没有墙的做法一样了。#i原创 2013-09-04 21:25:37 · 1116 阅读 · 0 评论 -
POJ 1325 ZOJ 1364 最小覆盖点集
题意:有A,B两台机器, 机器A 有 n个模式(0, 1, 2....n-1),同样机器B有m个模式, 两个机器一开始的模式都为0,有k个作业(id,x,y) 表示作业编号id, 该作业必须在A机器在模式x下或者B机器在模式y下完成,问你至少要切换几次机器模式。思路:很裸的最小覆盖点集,不熟悉概念的多看看蓝书吧,很容易证明 最小覆盖点集 == 最大匹配#include #include原创 2013-09-04 22:58:58 · 1362 阅读 · 0 评论 -
POJ 3436 ACM Computer Factory 拆点 + 最大流
为什么要拆点:2 410 0 0 0 110 0 0 0 010 0 1 1 110 0 1 1 1拆点10, 不拆点20 做最大流的题目无非是这两步。1.建图2.套sap+gap优化的模板View Code #include#includestring.h>#includeusing namespace std;#defi原创 2013-08-29 10:35:56 · 807 阅读 · 0 评论 -
POJ 1966 Cable TV Network 顶点连通度的求解
用拆点把点权变为边权。然后用最大流求解每对u、v(u != v),取其中的最小值注意:具体操作时,有个技巧,可以将枚举从O(n^2)优化到O(n):先固定一个点,然后枚举另一个点即可。很显然的一个结论:max_flow(1->2->3) 3)我们要取其中的最小,可以不必去求2->3的最大流如果以1为源点,汇点只能是剩下的几个点,枚举汇点即可。 本题要多次求最大流,所原创 2013-08-29 10:36:30 · 848 阅读 · 0 评论 -
POJ 2135 Farm Tour 费用流入门题
View Code #include#includestring.h>#include#includeusing namespace std;#define maxn 1010#define maxm 10003#define inf 1000000000int min(int a, int b){ return a a : b;}原创 2013-08-29 10:36:14 · 872 阅读 · 0 评论 -
POJ 1144 Network 求割点个数
View Code #include#includestring.h>#define maxn 110#define maxm maxn * maxn#define inf 1000000000int min(int a, int b){ return a a : b;}struct E{ int v, next;}ed原创 2013-08-29 10:36:39 · 922 阅读 · 0 评论 -
poj2195 Going Home 费用流
View Code #include#includestring.h>#include#includeusing namespace std;#define maxn 100300#define maxm 200003#define inf 1000000000int min(int a, int b){ return a a : b;原创 2013-08-29 10:36:18 · 756 阅读 · 0 评论 -
POJ 2516 Minimum Cost k次费用流
View Code #include#includestring.h>#include#includeusing namespace std;#define maxn 110#define maxm 6000#define inf 1000000000int min(int a, int b){ return a a : b;}s原创 2013-08-29 10:36:21 · 723 阅读 · 0 评论 -
UVa 1515 简单最小割模型
本题评价:对于最小割题目不能马上识别出算法,主要问题还是做题太少的缘故。这题其实跟最小割入门POJ3469完全没有什么差别,这题也是一年前做的,如今遇到类似的题,还是花了点时间才想出来,太水了。题意:给你一幅图,(#)代表草,(.)代表洞,把一个草变成洞需要费用d, 把一个洞变成草需要费用f,图的外面一圈必须变成草,如果每对相邻的草和洞(上下左右) 需要额外加费原创 2013-07-22 22:31:25 · 1509 阅读 · 0 评论 -
UVA 12264 二分+最大流 基础题
题意略坑,不解释。 看懂了水题一道。也不算什么中等题,简单题罢了,随便保存一下代码。#include #include #include using namespace std;const int maxn = 410;const int inf = 1e9;struct Edge { int v, c, next; Edge(){} Edge(int v, int c,原创 2013-07-23 23:32:29 · 1418 阅读 · 0 评论 -
UVa 1440 只有下界的最小流
题意:给你一幅有向图,你每次可以从任意点出发。图中的每条边至少要经过一次,问你至少要走几次。建图:设每个点i的入度减去出度为d[i], S为源点,T为汇点。对于d[i] > 0的点i, 连边对于d[i] 其它边连法与输入的边相同。问题:对于输入的每条边下界为1,我们要求的是最小值,所以问题可以转化为求该图的最小流,显然,对于没有下界的网络 其最小原创 2013-07-21 16:48:20 · 2077 阅读 · 0 评论 -
POJ 3469 Dual Core CPU 最小割入门题
View Code #include #includestring.h> const int maxn = 20100; const int maxm = 200200; const int inf = 129; struct node { int v, c, next; }edge[maxm*6]; int head[max原创 2013-08-29 10:36:00 · 712 阅读 · 0 评论 -
POJ 1815 Friendship 最小割 + 字典序输出割点
View Code #include#includestring.h>#includeusing namespace std;#define maxn 410#define maxm 40003#define inf 1000000000int min(int a, int b){ return a a : b;}struct E原创 2013-08-29 10:36:02 · 979 阅读 · 0 评论 -
POJ 2942 Knights of the Round Table 边双连通分量求解
边双连通分量求解要点:1.通过割点找变双连通分量。2.点入栈,当前边(u->v)的v点等于栈顶的点时停止出栈。3.每个割点可能属于多个连通分量。 G++ AC,哪位大神帮忙改成C++ ACView Code #include#includestring.h>#include#includeusing namespace std;#define max原创 2013-08-29 10:36:43 · 691 阅读 · 0 评论 -
POJ 1466 最大独立集入门
题意:n个学生,给你每个学生浪漫的学生学号(男女之间浪漫),问你找出一个最大的集合保证集合内的任意两个学生之间没有相互浪漫关系,输出最大集合的人数。注意:这里的浪漫边是双向的,如果1对2浪漫, 那么2对1也浪漫,题意好像没说清楚, 但我测了一下,是双向边。思路:最大独立集和最小点覆盖集是互补的,所以 最大独立集 == 总人数n - 最小点覆盖集,如果题目给你的是二分图那么直接二分匹配一原创 2013-09-06 17:14:18 · 1232 阅读 · 0 评论 -
POJ1422 最小路径覆盖入门
题意:DAG求最小路径覆盖。注意:二分匹配只试用于求DAG的最小路径覆盖, 有环就不行,具体可以理解证明。对n个点进行拆点,分成左右两排点,对于边 建 。然后 最小路径覆盖 == 总点数n - 最大匹配。 简单的证明: 每匹配一对就说明u和v在同一条路径上,拿路径数就少1。#include #include #include #include using names原创 2013-09-06 16:17:41 · 952 阅读 · 0 评论 -
poj 2125 最小割解决 "最小点权覆盖问题" +输出解(割边集)
题意:给你一幅有向图, 对于点i删除所有进入该点的边就要支付费用W[i]+(情况1), 删除所有从该点出发的边就要支付费用W[i]-,问删除图中的所有边至少需要多少费用(情况2)。分析:首先我们根据题意,选点就能删除一些边, 那么这可以看成是“用点去覆盖边”, 这里无非是把边分成了2类,我们可以把原来的点进行拆点,那么就完完全全等价于“用点去覆盖边",如果支付费用都为1,那么这就是”最小点原创 2013-09-05 20:24:06 · 2176 阅读 · 0 评论 -
POJ图论列表,想学图论的可以做下,打*的是经典题,蛮多都比较难,基础知识多看几次再做
POJ图论列表,想学图论的可以做下,打*的是经典题,蛮多都比较难,基础知识多看几次再做原创 2013-08-29 10:35:58 · 1199 阅读 · 0 评论 -
POJ 1523 SPF tarjan算法入门
注意:对于生成树的每条边:u是割点的充要条件是:1、若u为根节点, 它有2个以上包括两个的儿子(son >= 2)2、u不为根节点,dfn[u] View Code #include#includestring.h>#define maxn 1005#define maxm maxn*maxnint min(int a, int b) { retur原创 2013-08-29 10:36:25 · 788 阅读 · 0 评论 -
重连通分量的求解
提两点:1.对于每个点连通分量,都是根据割点来找的。2.边入栈, 到当前边等于栈顶时停止出栈。3.割点属于多个点连通分量。邻接矩阵:View Code #include#includestring.h>#define maxn 22#define maxm 444#define inf 1000000000int min(int a, int b原创 2013-08-29 10:36:27 · 965 阅读 · 0 评论