摘要:
网络流回顾网络流问题:1、网络最大流。 2、流量有上下界网络的最大流和最小流。 3、最小费用最大流。4、流量有上下界网络的最小费用最大流等。在求解网络流问题是求解其他一些图论问题的基础。如求解图的顶点连通度和边连通度、匹配问题等可转化为网络求解。求解网络流涉及的几个主要概念:1、 容量网络、残留网络、层次网络;2、 增广路、前向弧、后向弧、网络流、割;3、 弧的容量、流量;4、 距离标号、活跃顶点、盈余、推进;5、 可行流、预流、最大流、可改进量、最小割。6、 拆点、路径压缩、最短路、DFS、BFS、二分搜索。一、网络最大流1、 一般增广路算法(Generic Augmenting Path)
阅读全文
posted @ 2012-08-16 20:28
wide sea
阅读(709)
推荐(0)
摘要:
题意:让士兵从任意十字路口出发,十字路口由街道相连,通过街道,走遍所有的十字路口,士兵走过的十字路口,就不能被在经过,求最小的士兵个数。注意:街道都是单向的,士兵的起点可以是任意点。解题思路:用二分匹配的思路,使用匈牙利算求出最大匹配数目 n ,士兵的个数,就是十字路口的数目减去 n 。因为每多一条边数,就减少一名士兵的使用。1422 Accepted 552K 0MS C++ 1011B代码如下:这题想到二分匹配的思路,就很简单了。View Code 1 #include<cstdio> 2 #include<cstring> 3 #include<cstdli
阅读全文
posted @ 2013-01-23 19:48
wide sea
阅读(126)
推荐(0)
摘要:
题意:两台机器 A, B。初始状态为 mode_0 工作模式,有k件工作时,就有 0~k-1 个工作模式。其中第 i 项工作可由 A 机器的 mode_x 或者 B 机器的 mode_y 来完成。不过机器转换模式需要手动操作。给出 k 项工作的要求,请求出完成 k 项工作最小需要的操作时。思路:第 i 项工作可由 A 机器的 mode_x 或者 B 机器的 mode_y 来完成,最小的操作数,一定是使用最少数量的机器模式,这些模式能完成所有的工作。以此为构图思路,将工作做边,模式做点,A, B 两种机器联想到二部图,将问题转化为最小点覆盖集问题,而最小点覆盖集 = 最大匹配数。然后你懂的。操作
阅读全文
posted @ 2013-01-23 19:43
wide sea
阅读(158)
推荐(0)
摘要:
题意:在所列人群中,选出两两没有关系的人数最大的集合。思路:寻找最大点独立集。最大独立点数 = 顶点数 - 最大匹配数;我采取无视男女建边,二分图的两侧都是 n 个人,因此根据关系,我得到的匹配数是真实匹配数目的两倍!这题目数据挺多的,邻接矩阵时间巨多,所以又又写了邻接表的,嘿嘿,时间差距好大。View Code 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 // 1466 Accepted 192K 485MS C++ 1296B
阅读全文
posted @ 2013-01-23 19:41
wide sea
阅读(182)
推荐(0)
摘要:
行列建边。konig定理:二分图的最小顶点覆盖数等于最大匹配数。证明:比如最大匹配是M。为了求最少的点让每条边都至少和其中一个点关联。M个点是足够的。就是说他们覆盖最大匹配的那M条边后,假设有某边e没被覆盖,那么把e加入后会得到一个更大的匹配,出现矛盾。M个点是必需的。匹配的M条边,由于他们两两无公共点,就是说至少有M个点才能把他们覆盖。题目大意:在一片由N * N(1 ≤ N ≤ 500)的方格阵表示的宇宙空间里,有些格子里面有一些小行星(Asteroid),小行星共有K(1 ≤ K ≤ 10,000)个。Bessie要在这个地区航行,它就需要消灭所有的小行星。Bessie有一种被称作“ap
阅读全文
posted @ 2013-01-23 19:39
wide sea
阅读(164)
推荐(0)
摘要:
题意:N个学生,P门课程,选出P个学生,每位学生代表不同的课程。其中只有见习了某门课程的学生才能成为那门课程的代表。思路:寻找最大匹配,P和学生匹配P门课程,以选课来建边,使用最大匹配的匈牙利算法即可。代码,尝试使用了优化的匈牙利算法HK(Hopcroft-Karp)。dfs增广代码:View CodeHK代码:(优化的算法)View Code 1 // poj 1469 407ms 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<queue> 6 u
阅读全文
posted @ 2013-01-23 19:36
wide sea
阅读(157)
推荐(0)
摘要:
很好的一道题目。题意:给定一个 M * N 大小的方格,地图有3中方格,墙、草地、空地。他的老板希望Robert能在地图中放置尽可能多的机器人。每个机器人可以向四个方向开火,激光可以穿透草地,但不能穿透墙壁。(http://www.cnblogs.com/g0feng/archive/2012/11/10/2763771.html)求出最大可以放置的机器人数。思路:建图方式:矩阵横竖块建二分图,将问题转化为最大匹配问题。这题是《图论算法理论、实现及应用》书中的例题,有详细的分析P361View Code 1 #include<cstdio> 2 #include<cstrin
阅读全文
posted @ 2013-01-23 19:33
wide sea
阅读(195)
推荐(0)
摘要:
大致题意:(出处:http://blog.csdn.net/lyy289065406/article/details/6762432) 为了保护放牧环境,避免牲畜过度啃咬同一个地方的草皮,牧场主决定利用不断迁移牲畜进行喂养的方法去保护牧草。然而牲畜在迁移过程中也会啃食路上的牧草,所以如果每次迁移都用同一条道路,那么该条道路同样会被啃咬过度而遭受破坏。 现在牧场主拥有F个农场,已知这些农场至少有一条路径连接起来(不一定是直接相连),但从某些农场去另外一些农场,至少有一条路可通行。为了保护道路上的牧草,农场主希望再建造若干条道路,使得每次迁移牲畜时,至少有2种迁移途径,避免...
阅读全文
posted @ 2013-01-23 19:30
wide sea
阅读(174)
推荐(0)
摘要:
寻找关节点,并输出是哪些点,同时,输出去掉其关节点后,产生的连通分量数。使用 tarjan 算法,便可完成,建图是现成的。View Code 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #include<vector> 5 using namespace std; 6 //Accepted 232K 0MS C++ 1492B 7 const int MAXN = 1100; 8 int max( int a, int b ){ return a > b ?
阅读全文
posted @ 2013-01-23 19:24
wide sea
阅读(155)
推荐(0)
摘要:
题意:有一个国家,有一个物资提供城市(编号为0),它负责通过城市间的路线向该国首都(编号为n-1)传送物资,但这些城市间的路线上传送的物资的量是有限的,所以传到首都的物资太少,所以国王想花钱修某些城市间的道路,使之传送的物资量增多以增加首都物资获得量。为了避免浪费钱力,他想找出那些只要重建(扩建)就能使首都物资获得量增加的道路。问这样的道理有几条。思路:须重建(扩建)道路一定是最大流中的满流边。所以,先最大流一次,再枚举满流边,使其容量 +1,并搜索是否存在起点(0)到终点(n - 1)的增光路,存在的话,则这条边是可扩建的道路。做完这题,去做一下zoj的2532,极其相似的,练练手吧。POJ
阅读全文
posted @ 2013-01-23 19:22
wide sea
阅读(163)
推荐(0)
摘要:
题意:删去最小的点数使原图不连通。思路:求最大独立轨数就是答案。需要对原图进行拆点,重新建图。建图方法:将每一点 v 拆成 v' 与 v'',连一条 v' -> v'' 的边(所有这样的顶点 v,构成了一个割顶集),容量为1;然后,将 u -> v 的边拆成 v'' -> u', u'' -> v' 两条边;最后求起点 src 到终点 des 的最大流即可,其中 src = src'', des = des'。View Code 1 #include&
阅读全文
posted @ 2013-01-23 19:18
wide sea
阅读(209)
推荐(0)