图论
文章平均质量分 78
sdj222555
这个作者很懒,什么都没留下…
展开
-
POJ 3895 Cycles of Lanes
题意是求最大环的边数。做这题发现用vector特别好用。DFS即可。/*ID: sdj22251PROG: calfflacLANG: C++*/#include #include #include #include #include #include #include #include #include #include #include #include #i原创 2011-08-18 10:11:18 · 1018 阅读 · 0 评论 -
HDU 2962 Trucking 最短路
最一般的方法就是二分高度,每次求一次最短路,看能不能求出来。 我的做法是先求一次最大生成树的最小边,就能得到高度,然后再求一次最短路。这样在高度比较大和数据比较大的时候,效率比二分那个方法要快很多。 poj 1797和这题比较类似, 只不过那题简单一些,只要求高度即可,不用求最短路。我是用的是dijkstra求最短路和prim 求最大生成树。代码有点乱。求最大生成树的关键点是只要连接到终点原创 2011-08-15 22:32:42 · 817 阅读 · 0 评论 -
POJ 1129 Channel Allocation 平面图染色问题
这题大意就是,给出一个平面图,对顶点进行染色, 相邻顶点是不能用同一种颜色。由四色定理,我们知道任何平面图的色数是不超过4的,所以运用这个进行暴搜,当然这题的数据不强,DFS或者贪心搞都能过/*ID: sdj22251PROG: subsetLANG: C++*/#include #include #include #include #include #includ原创 2012-01-23 19:13:36 · 931 阅读 · 0 评论 -
POJ 2723 二分+ 2-sat 判定
此题的题意很简单,有一些个门, 还有2 * n个钥匙分成了n组,每组里有两把钥匙,并且每组中只能使用一把钥匙, 然后每个门有两把锁,分别对应着钥匙,两个锁只要任意开一个门就会打开,并且,要打开一个门,必须保证他序号之前的所有门都打开了,类似于一关一关的往里闯然后思路的话,由于是必须顺序的开门,所以可以进行二分枚举答案,如果枚举的数为m, 则我们要判定的就是1~m的门是否能被打开, 就要原创 2012-07-04 11:51:23 · 969 阅读 · 0 评论 -
POJ 3678 Katu Puzzle 2-sat 判断是否有合法解
建图如下AND 1 a0->a1,b0->b1AND 0 a1->b0,b1->a0OR 1 a0->b1,b0->a1OR 0 a1->a0,b1->b0XOR 1 a0->b1,a1->b0,b1->a0,b0->a1XOR 0 a0->b0,b0->a0,a1->b1,b1->a1需要注意的是,如果a,b的值已经原创 2012-07-03 15:24:47 · 873 阅读 · 0 评论 -
POJ 3207 2-sat 判断是否有合法解
---------------------------------------------------------------------------------------------------------以下转载自http://cainiao2hao.blogcn.com/articles/poj3207.html平面上,一个圆,圆的边上按顺时针放着n个点。现在要连m条边,比如a,b,那原创 2012-07-03 21:25:47 · 2204 阅读 · 0 评论 -
POJ 3683 2-sat 输出解
题意方法和之前的3648基本一样注意输出解的方式,分成两部分的点集,应该遍历其中一个点集,根据染色判断选择该点集的点还是另一个点集的点#include #include #include #include #include #include #include #define MAXN 5005#define MAXM 50005#define INF 1000000000原创 2012-07-05 18:37:43 · 954 阅读 · 0 评论 -
POJ 2749 二分+2-sat判定
这题还是挺好想建图的 二分判定就行了#include #include #include #include #include #include #include #define MAXN 2005#define MAXM 50005#define INF 1000000000using namespace std;vectorg[MAXN];int n, A,原创 2012-07-05 21:10:29 · 723 阅读 · 0 评论 -
COJ 1253 二分+2-sat判定
X城的精神病院只有两个病房,一共关着N 名病人,编号分别为1~N。病人之间的关系有时极不和谐。很多病人之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突。我们用“不和谐值”(一个正整数值)来表示某两名病人之间的仇恨程度,不和谐值越大,则这两名病人之间的积怨越多。如果两名不和谐值为c 的病人被关在同一病房,他们俩之间会发生摩擦,并造成影响力为c 的冲突事件。每年年末,院里会将本年内病房中的所有原创 2012-07-05 21:36:11 · 1382 阅读 · 0 评论 -
POJ 3648 2-sat 输出解
这题的题意稍不留神就会看错,注意那个keep ...from 是啥意思所以新娘看不见本排的情况,只能看见对面,要求不能看见不正常关系的一对。并且夫妇不能同时坐在一边。很明显的模型了,由于新娘看的是对面的情况,所以就需要对新娘对面的人来分析建图,n对夫妇是2 *n个点, n对夫妇每对夫妇只能挑一个到新娘对面坐下,这很符合2-sat的初始的状态。然后又有一些不正常关系,就需要分别建图了。 并且原创 2012-07-05 15:55:58 · 2540 阅读 · 0 评论 -
POJ 1966 Cable TV Network 无向图的点连通度
求无向图的点连通度,一般的方法就是转化为网络流来求解构建网络流模型:若G为无向图:(1)原G图中的每个顶点V变成N网中的两个顶点V'和V'',顶点V'至V''有一条弧容量为1;(2)原图G中的每条边e=(U,V),在N网中有两条弧e'=(U'',V'),e''=(V'',U')与之对应,e'与e''容量均为无穷;(3)以某点为源点,枚举汇点,求最大流。其中源点的确立有一原创 2012-01-17 18:03:23 · 1249 阅读 · 0 评论 -
HDU 3622 二分+2-sat
这题二分的话,二分半径可以过,但是二分半径的平方就会跪,不知道为什么#include #include #include #include #include #include #include #include #define MAXN 255#define MAXM 50005#define INF 500000005#define eps 1e-7using原创 2012-07-06 12:49:02 · 1163 阅读 · 0 评论 -
POJ 1637 混合图欧拉回路的判定
以下解释转自http://www.cnblogs.com/destinydesigner/archive/2009/09/28/1575674.html1 定义欧拉通路 (Euler tour)——通过图中每条边一次且仅一次,并且过每一顶点的通路。欧拉回路 (Euler circuit)——通过图中每条边一次且仅一次,并且过每一顶点的回路。欧拉图——存在欧拉回路的图。原创 2012-07-09 15:20:34 · 706 阅读 · 0 评论 -
网络流几题
只说建图 代码用的模板都一样,所以只发一份就好了POJ 1149 PIGS : 这题建图还真有点巧妙,首先建立超级源点和汇点,源点和每个猪圈的第一个顾客连边,容量为猪圈中的猪个数,如果一个人是多个猪圈的第一个顾客,那就把这些值加起来,再连边,当然用邻接表的话这就无所谓了。 刚开始我想的是把源点和每个猪圈连边来着,然后猪圈再和每个第一位顾客连边,后来一想,没必要,而且猪圈的个数又比较多,原创 2012-07-07 17:24:35 · 729 阅读 · 0 评论 -
POJ 1815 给定源汇的无向图点连通度 输出字典序最小的方案
无向图的点连通度转化为最大流来求解是个非常经典的模型了。当源与汇固定时构建网络流模型:若G为无向图:(1)原G图中的每个顶点V变成N网中的两个顶点V'和V'',顶点V'至V''有一条弧容量为1;(2)原图G中的每条边e=(U,V),在N网中有两条弧e'=(U'',V'),e''=(V'',U')与之对应,e'与e''容量均为无穷;(3)求最大流。原创 2012-07-09 21:21:05 · 1283 阅读 · 0 评论 -
POJ 2914 Minimum Cut 全局最小割
算法基于这样一个定理:对于任意s, t V ∈ ,全局最小割或者等于原图的s-t 最小割,或者等于将原图进行 Contract(s, t)操作所得的图的全局最小割。 算法框架: 1. 设当前找到的最小割MinCut 为+∞ 2. 在 G中求出任意 s-t 最小割 c,MinCut = min(MinCut, c) 3. 对 G作 Contract(s, t)操作,得原创 2012-06-29 16:09:54 · 2835 阅读 · 0 评论 -
POJ 3522 最大边与最小边差值最小的生成树
这道题的题意很明了。求最大边与最小边差值最小的生成树首先,把所有的生成树都求出来是不可能的,所以,必须用别的方法。在学习次小生成树的过程中,知道了一个最小生成树的性质, 一个图的最小生成树不一定是唯一的,但是组成这些最小生成树的各个边的权值一定都是一一对应相同的。不会出现这种一个树上有两个边权值a+b等于另外一颗树上两个边c+d,然后这两个树都是最小生成树的情况。 对于本题来讲,上面原创 2012-06-28 13:04:35 · 5989 阅读 · 2 评论 -
POJ 3635 Full Tank? 最短路变形
题意:给出一张图,n网上大部分的思路都是类似于dij的那种扩展。首先定义一个二维数组dp。 dp[i][j] 表示走到i点剩余j个单位的汽油时的最小花费然后维护一个优先队列。 每次有两种可扩展的状态,一是加一个单位的油,二是走向邻接点,然后不断的将状态加入优先队列中#include #include #include #include #include #d原创 2012-06-26 15:15:53 · 3313 阅读 · 0 评论 -
POJ 2728 最优比率生成树 01分数规划问题
网上有一些很数学的证明方法,表示看的挺晕,自己理解了一下后,发表下自己的看法,如果有错误,再进行修改其实原题就是求 MIN( ∑CiXi / ∑DiXi ) Xi∈{0,1} ,对每个生成树,设其比率r=∑CiXi / ∑DiXi ,可得∑CiXi - ∑DiXi * r=0(条件1)那么对于所有的生成树,显然∑CiXi - ∑DiXi * min(r) >= 0,当 ∑CiX原创 2012-04-23 18:58:49 · 4902 阅读 · 2 评论 -
HDU 3986 最短路+枚举
这题HDU 1595 find the longest of the shortest 就是一模一样的但是出现了重边,就比较恶心人了然后就将输入的数据先排序,然后出现重边的肯定在一块,然后对每条边存储的是它最短的情况和次短的情况即可/*ID: CUGB-wwjPROG:LANG: C++*/#include #include #include #include #原创 2012-04-10 22:30:26 · 927 阅读 · 0 评论 -
POJ 1236 Network of Schools HDU 3836 Equivalent Sets 强连通分量+缩点 tarjan or kosaraju
1,POJ 1236有一些学校连接到一个计算机网络,这些学校之间达成了一个协议:每个学校维护着一个学校列表,它向学校列表中的学校发布软件。注意,如果学校B在学校A的列表中,则A不一定在B的列表中。任务A:计算为使得每个学校都能通过网络收到软件,至少需要准备多少份软件拷贝。任务B:考虑一个更长远的任务,想确保给任意一个学校发放一个新的软件拷贝。该软件拷贝能发布到网络中的每个学校,为了达到原创 2012-03-23 22:25:32 · 991 阅读 · 0 评论 -
POJ 2135 最小费用最大流
这道题的题意就是,一个无向图,一个人从起点出发,到终点后往回走,但是走过的路不想走第二遍,也就是说必须存在两个路径从起点到终点,且这两个路径中不能有相同的边。那么建图就比较好想了,建立一个超级源点,一个超级汇点,因为是无向图么,所以源点到点1的流量为2,费用为0,点1到源点的流量为2,费用为0,同理点n和源点,然后其他的边流量就是1,费用就是边长了。注意都是加双向边。刚开始比较恶心原创 2012-03-05 14:27:47 · 747 阅读 · 0 评论 -
BOJ 334 大扫除 拓扑排序
很裸的一个拓扑排序。/*ID: CUGB-wwjPROG:LANG: C++*/#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #原创 2012-03-03 16:20:45 · 781 阅读 · 0 评论 -
POJ 3249 拓扑排序+ 简单DP
为啥要给这个水题写个解题报告呢因为这个题太坑人了。非常简单的题意,但是数据量超级大我首先用了DFS,毫无疑问超时了然后又BFS,居然又超时了然后加上超级源点超级汇点后SPFA,各种WA后继续超时最后逼急了去写拓扑排序,瞬间就过了。 加了读入优化后能排进第一版了。其实刚开始就准备写拓扑了,但是为了试验算法,TLE和WA了好长时间,#include #in原创 2012-07-01 14:49:37 · 2034 阅读 · 0 评论 -
POJ 1639 k度限制生成树
题意就是求最小生成树 但是有一个顶点的度必须不大于k具体的方法网上都有,但是代码写起来之复杂难以令人想象,我由于代码能力还太弱,导致只能看着别人的代码重写一遍,优化了一些部分。1.求出除去K度点的最小生成森林,设森林数为m2.将这m棵树与K度点用每棵树中与K度点距离最短的点相连,生成一个m度最小生成树,总答案为这个生成树的所有边长之和3.迭代k-m次,尝试将m度生成树扩展为K原创 2012-06-27 22:51:54 · 3001 阅读 · 0 评论 -
POJ 1679 The Unique MST 次小生成树
题目大意就是问是否有多个权值相同的最小生成树有两种方法, 一种是枚举删边,然后接着构造最小生成树,但是复杂度比较大另外一种就比较好了 , 是求次小生成树的方法, 把生成树上任意两点间的最大边在求最小生成树的同时预处理出来,然后n2的枚举任意两点,如果这两点在最小生成树中不是相邻的,就可以删掉两点间的最大边,换上新边,即他俩之间的直接的边,在邻接矩阵中就是他们的距离。第一种方原创 2012-06-26 17:24:05 · 809 阅读 · 0 评论 -
POJ 3621 最优比率生成环 01分数规划问题
题目大意就是找到一个环使得顶点权值之和与边权之和的比率最大首先,需要注意的是题目要求可以从任意一点开始,网上很多解题报告默认的从1点开始,虽然过了此题,但是显然是不太对的由于题目是求的max,那么在边权变形后,用 SPFA求最长路,看是否出现正环, 然后根据这个进行二分查找。如果不懂图是怎么构建的,可以看一下01规划具体是怎么做的。#include #include原创 2012-06-26 11:11:00 · 2602 阅读 · 0 评论 -
POJ 3613 Cow Relays floyd + 快速幂
本题的大意就是问从S 到 T 经过边得个数恰为k的最短路是多少。参考国家队集训论文 08年的 矩阵乘法在信息学中的应用01邻接矩阵A的K次方C=A^K,C[i][j]表示i点到j点正好经过K条边的路径数 对应于这道题,对邻接图进行K次floyd之后,C[i][j]就是点i到j正好经过K条边的最短路但是K次floyd难免复杂度太高了。 所以可以使用快速幂的方法,二分原创 2012-06-25 21:40:06 · 3636 阅读 · 0 评论 -
POJ 3463 最短路 次短路
本题是求最短路和比最短路距离长1的次短路的个数,于是就用到了dijkstra主要的改变就是数组都开到了二维,第二维用来表示是最短路还是次短路比如d[][]数组和vis[][]数组而cnt数组使用来存取最短路和次短路的次数那么最外层的循环就要到2*n-1次了,其中n-1次是用来求最短路的,还有n次是次短路的然后松弛的条件就要改变了,有四种情况1.比最短路短2.等于最短路3.长原创 2012-06-25 18:14:56 · 4123 阅读 · 0 评论 -
POJ 2449 Remmarguts' Date 第K短路 A* + SPFA
题目大意就是给出一个图,然后给出一个起点个一个终点,求这两点间的第K短路。本题中是可以走重复的路的,所以如果一张图中有一个环的话,无论求第几短路都是存在的。网上大部分的方法都是用A* + 最短路的方法做的。 对于A* ,估价函数 = 当前值+当前位置到终点的距离,即 F(p)=g(p)+h(p),每次扩展估价函数值中最小的一个。对于k短路来说,g(p)为当前从s到p所走的长度原创 2012-06-25 15:39:41 · 7446 阅读 · 5 评论 -
POJ 1470 LCA 公共祖先
裸题一个/*ID: CUGB-wwjPROG:LANG: C++*/#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #in原创 2012-04-21 10:57:09 · 928 阅读 · 0 评论 -
POJ 2874 LCA 树上任意两点距离
本题说了是无环图,所以就是一片森林了。 而对于树上的任意两点,我们可以用LCA求其距离。距离为两个子节点到根的距离和减去最近祖先到根的距离的2倍。具体画图便可看出来。 并且图是无向图,所以LCA时需要进行标记POJ 1986同这道题 基本一样/*ID: CUGB-wwjPROG:LANG: C++*/#include #include #include #incl原创 2012-04-21 09:51:37 · 5559 阅读 · 0 评论 -
POJ 1087 A Plug for UNIX 最大流
看完题以后就觉得是个最大流了。然后脑子不太清醒,想了一会儿才发现建图好简单啊,不过中间理解错题意了,题目中说有K种适配器,也就是说每种适配器的数量是无限个的,而我理解成了K个适配器了。。。 然后就WA了几次。。。建图: 加一个超级源点, 超级汇点。 源点与每个电器相连,容量为1,每个电器与其相应的插座相连,容量为1,插座之间能转化的就连一条无限容量的边,最后每个插座跟汇点相连,容量为这种原创 2012-04-16 17:29:38 · 1068 阅读 · 0 评论 -
HDU 2121 无固定根的最小树形图
参考了http://blog.csdn.net/wsniyufang/article/details/6747604本题为不是固定根的最小树形图,我们可以虚拟出一根来,然后在把这个根跟每个点相连,相连的点可以设为无穷大,或者设为所有边和大一点,比如为r,然后就可以利用最小树形图进行计算了,计算出的结果减去r,如果比r还大就可以认为通过这个虚拟节点我们连过原图中两个点,即原图是不连通的,原创 2012-04-14 02:00:42 · 1282 阅读 · 0 评论 -
POJ 3164 最小树形图 朱刘算法
参考了芳哥的博文 http://blog.csdn.net/wsniyufang/article/details/6747392说一下自己的理解。最开始的图,把所有的最小入边都累加到ret里。至于为什么,因为这样才能保证所得的ret有可能是最小树形图的解,当然,是在这些最小入边集合不行成环得情况下。如果有了环,ret肯定不是最终答案,因为环中间有的边需要删掉,而且环之间也要连接起来。现原创 2012-04-14 01:17:56 · 14422 阅读 · 4 评论 -
HDU 3605 Escape 最大流
题目大意不再赘述,很容易看出来是最大流,只不过人比较多,有100W个,所以需要进行压缩,可以看到m是比较小的,非常容易就能联想到2进制,所以就压缩成了1024个节点,每个结点有一个值,代表有多少人是这个状态,然后建立超级源点, 超级汇点,源点与1024个结点连线,边权为结点的值,然后每个源点再与m个星球进行连线,边权为无限大,然后每个星球再与汇点进行连线,值为该星球的容纳量。/*原创 2012-04-13 10:21:14 · 1236 阅读 · 0 评论 -
POJ 3436 最大流
很羞愧啊 , 题都没看咋懂翻译见:http://hi.baidu.com/lewutian/blog/item/1b0709220085b7fed7cae28b.html/cmtid/87a1a0ad1aebe6064b36d60e题解参考了:http://zhyu.me/acm/poj-3436.html ,BUPT一位现役神牛的blog每台机器分输入输出,很显然直接拆点,每原创 2012-04-11 21:01:26 · 990 阅读 · 0 评论 -
HDU 3991 最短路+最小路径覆盖
题目大意就是,有一个图,上面有一些顶点,代表一些城市,在某些时刻, 某个城市里会有人需要礼物, 哈利波特需要及时的将礼物送到,但是哈利每1秒只能走一个单位长度,所以他需要朋友的帮助,来使所有的人都能及时的收到礼物。问需要的最少的朋友个数。那么看完题目后,实际上可以发现其跟路径覆盖非常有关系,因为是一些人走一些路径来将礼物送到。所以要先将任意两点间的最短路求好。然后枚举任意两个任务,原创 2012-04-10 22:43:57 · 751 阅读 · 0 评论 -
HDU 3987 最小割模型
读完题后,就知道是最小割了,最小割=最大流,但是题目又说要最少边的最小割,输出边的个数这样建边得时候就要换种方式了,将边权w变为w *(E + 1) + 1,这时候求出的最大流实际上附带了一个信息,就是边的个数,最后的结果直接mod (E+1 )即可/*ID: CUGB-wwjPROG:LANG: C++*/#include #include #include原创 2012-04-10 22:34:18 · 1005 阅读 · 0 评论 -
POJ 3020 最小边覆盖
题目大意就是有一些'o'和'*'构成的图,每个*可以与其四周的'*'连一条边,但是连完之后这两个‘*’就称作被覆盖了,不能与其他的'*'发生交集了。 然后问用最少的边能把所有的‘*’都覆盖掉看到是两两连边不由得想起二分图匹配,实际上就是用最少的边覆盖所有的点的问题,我觉得最小边覆盖实际上就是最小路径覆盖的一个特殊情况,只不过要求必须是二分图才行而最小路径覆盖只要是PxP的有向图就行。 而他原创 2012-04-10 09:52:55 · 2408 阅读 · 0 评论