
图论
小狐狸jun
菜鸟飞呀飞~
展开
-
POJ3228 并查集或二分最大流枚举答案
忘记写题意了。这题题意:给出每个地点的金矿与金库的数量,再给出边的长度。求取最大可通过边长的最小权值使每个金矿都能运输到金库里。这题和之前做的两道二分枚举最大流答案的问法很相识,但是这里用最大流速度不够快,所以用了并查集来判断。方法:边排序后,每次边判断为,将两点合集,若合集中满足金库数量大于金矿数量 则该合集满足条件。代码:#include#include#include原创 2014-02-28 19:29:01 · 995 阅读 · 0 评论 -
poj2914无向图的最小割模板
题意:给出无向图的点,边,权值。求最小割。 思路:根据题目规模,最大流算法会超时。网上参考的模板代码。 代码:/*最小割集◎Stoer-Wagner算法:一个无向连通网络,去掉一个边集可以使其变成两个连通分量则这个边集就是割集;最小割集当然就权和最小的割集。prim算法不仅仅可以求最小生成树,也可以求“最大生成树”。最小割集Stoer-Wagner算法就是典型的应用原创 2013-08-07 16:10:13 · 2026 阅读 · 0 评论 -
poj2942(双联通分量,交叉染色判二分图)
题意:一些骑士,他们有些人之间有矛盾,现在要求选出一些骑士围成一圈,圈要满足如下条件:1.人数大于1。2.总人数为奇数。3.有仇恨的骑士不能挨着坐。问有几个骑士不能和任何人形成任何的圆圈。 思路:首先反向建立补图,然后问题转换成在图中找奇圈,圈肯定出现在双联通分量中,则求出图的双联通分量,又通过特性知道,一个双联通分量有奇圈则其中的点都可以出现在一个奇圈中。而对于奇圈的判定可以用交叉染色判原创 2013-08-07 11:49:22 · 3165 阅读 · 0 评论 -
poj 1523求割点
题意:给出一个无向图,求割点以及去除这个点后图分为几部分; 思路:割点定义:去掉该点后图将分成几个部分。割点:(1)当k为根节点且有>1个分支,则去除该点后图便被分成几个分支。(2)DFN[v] 代码:#include#include#includeusing namespace std;#define MAXN 1005#define MAXM 1005*原创 2013-08-06 19:49:42 · 547 阅读 · 0 评论 -
poj 3177-3352边双联通
买一送一啊 3177和3352的区别在于3177数据有重边!但是我先做3177的 那么就直接ctrl+c+v搞3352了~。 题意:给一个无向图,要令每个点之间至少有两条不重合的路,需要至少加多少条边。 思路:找出无向图中边双联通的点进行缩点后,根据缩点图的每条边(割边)给缩点增加度数,通过图的结构可以得出公式:至少增加的边数 =(这棵树总度数为1的结点数 + 1 )/ 2原创 2013-08-05 21:24:40 · 844 阅读 · 0 评论 -
poj 1679 Prim判断次短路
题意:判断最短路是否唯一。思路:先prrim一次求出最短路同时记录最短路加入的边;然后枚举所求边,将其删除再求n-1次prim,判断再次所求得的最短路与第一次求得的次短路的关系。 代码:#include#include#include#define MAXN 5050#define inf 100000000using namespace std;s原创 2013-07-29 20:45:01 · 590 阅读 · 0 评论 -
poj 3613 floyd + 快速幂
题意:本题的大意就是问从S 到 T 经过边得个数恰为k的最短路是多少。 思路:对于邻接矩阵每一次floyd求的是每个点间的最短距离,则n次floyd就是每个点间n条路的最短距离(可以重复边);但是由于k次floyd时间复杂度会超,则运用了快速幂的方法。 代码:#include #include #include #include #include #de原创 2013-07-28 17:55:20 · 546 阅读 · 0 评论 -
poj 2762 强连通缩点+拓扑排序
这题搞了好久,先是拓扑排序这里没想到,一开始自己傻乎乎的跑去找每层出度为1的点,然后才想到能用拓扑排序来弄。拓扑排序的时候也弄了挺久的,拓扑排序用的也不多。题意:给一个图求是否从对于任意两个点能从v 到w 或者从w到v连通。思路:单连通,先强连通缩点,若scnt为1,或者出度为零的点为0,直接输出YES,若出度为零的点大于1,则代表有分支输出NO。若出度为零的点为1,判断组成的树是否为原创 2013-08-03 20:58:31 · 797 阅读 · 0 评论 -
poj3463 最短路和比最短路长1的路径数
这题需要很好的理解Dij。在Dij的基础上,每个点多一个次短路的长度和数量进行控制。那么在队列中,最短路控制时出现n次,次短路控制出现n次。注意松弛条件中val值和最短路、次短路的关系。这题需要了解的是,对vis[i][0]控制确定每个点的最短路长度,对vis[i][1]控制确定每个点的次短路长度。代码:#include#include#include#includ原创 2013-07-28 16:44:38 · 747 阅读 · 0 评论 -
poj 3013 SPFA
首先看题看的很懵..然后这题直接没想用Djstra做 TLE了。看discuss,Dijstra要用堆优化,也可以用SPFA做。这里在网上找了这两种做法的区别,点多稠密图用Dij,以为它是操作点的,反之则用SPFA。好久没做题了,前一段时间尽做水题去了。还有这一道题的数据巨大,各种WA。要用__int64,同时SPFA中要注意环的问题。dis的初始化也要注意全部初始为无穷大。先原创 2013-07-21 16:27:40 · 1623 阅读 · 1 评论 -
poj 2553 强连通
题意:给出一个有向图,定义:若节点v所有能到达的点{wi},都能反过来到达v,那么称节点v是sink。题目要求所有的sink点。 思路:强连通缩点找出出度为零的点,输出即可。 这题主要问题是读题,了解题意之后就好做了,然后在数组开小了导致WA?挺莫名其妙的。。 代码:#include #include #include #include using na原创 2013-08-02 16:08:58 · 441 阅读 · 0 评论 -
poj1236强连通缩点
题意:给出每个学校的list 代表该学校能链接的其他学校,问1:至少给几个学校资源使所有学校都得到;2:至少加多少个边能让所有学校相互连通; 思路:1:找出缩点后入度为零的点个数 2:找出缩点后入度为零个数和出度为零个数之间的最大值。 这题主要是在思考出入度和连通间的关系,了解了这个关系后就很水了。同时要注意图一开始就连通的情况。 代码:#include #inc原创 2013-08-01 15:06:45 · 520 阅读 · 0 评论 -
poj 3522 Kruskal
题意:求图的一个生成树使其最大边权与最小边权的差值最小,求其最小值 思路:利用贪心思想,先对边进行排序,然后从最小边开始枚举,每次进行kruskal向右加入边,若加入边刚好能遍历所有点,记录最后加入的边与第一个边的差值。最后得到最小值。 在kruskal枚举第一个边的时候没有加入判断是否剩下的边能够组成一个树,结果WA了几次,但是怎么觉得不加也没所谓呢。。? 代码:#i原创 2013-07-31 20:57:53 · 521 阅读 · 0 评论 -
poj3249 拓扑排序+DP
题意:给出一个有向无环图,每个顶点都有一个权值。求一条从入度为0的顶点到出度为0的顶点的一条路径,路径上所有顶点权值和最大。 思路:因为是无环图,则对于每个点经过的路径求其最大权值有,dp[i]=max(dp[j]) j为i的子节点集合。再根据其要求入度为零为顶点,可以用拓扑排序每次枚举入度为零的点删去找下一个入度为零的点进行dp。 代码:#include #includ原创 2013-08-08 09:36:02 · 1758 阅读 · 0 评论 -
poj 1330 LCA最近公共祖先
今天学LCA,先照一个模板学习代码,给一个离线算法,主要是方法并查集加上递归思想。 代码:#include#include#include#includeusing namespace std;#define MAXN 10001int f[MAXN];int r[MAXN];int indegree[MAXN];int vis[MAXN];ve原创 2013-08-17 21:04:58 · 1613 阅读 · 2 评论 -
poj3723 MST好题 kruskal
#include#include#include#includeusing namespace std;#define inf 10000000#define MAXN 20000struct Edge{ int x,y,len;}e[3*MAXN];int n,m,r,ans;int fa[MAXN];int find(int x){ if(x != fa[x])原创 2014-02-26 20:36:50 · 681 阅读 · 0 评论 -
hdu 2066 最短路水题
题意:给出多个可选择的起始点和终点,求最短路 思路:执行起始点次的spfa即可 代码:#include#include#includeusing namespace std;#define MAXN 1100#define MAXM 5000#define inf 2000000000struct Edge{ int to,next;原创 2013-10-22 19:20:18 · 559 阅读 · 0 评论 -
hdu 3722 二分图 最优完备匹配 KM算法
这题只要想到是最优完备匹配就行了;题意:给出n个字符串,若两两相连,将前一个反置添加到后一个后面,相连的值为两个字串从头开始相等的字符个数;问如何匹配得出最大值;思路:建图,套模板。代码:#include#include#include#includeusing namespace std;#define CLR(arr, what) memset(a原创 2013-09-03 15:34:00 · 708 阅读 · 0 评论 -
poj 1149经典网络流构图
题意:m个猪圈,n个客户,每个客户给出选则猪圈的钥匙和需要购买猪的个数,其中每次客户购买时客户选则的猪圈数量可以相互更换,问最大购买数量。 思路:以客户作为除源点汇点之外的点,然后对于每个猪圈从源点连其第一次购买的客户,容量为其猪的个数,随后链接其下一次购买的客户容量为无穷。最后每个客户与其汇点相连,数量为想要购买的个数。 一开始没想出来,其实对于每个需求,只要控制好其源点容量的进原创 2013-09-03 10:05:46 · 881 阅读 · 0 评论 -
poj 2455 二分+最大流
这个因为点少用邻接矩阵做的。 题意:求由1到n的t条不重复路径中最大边权值的最小值。 思路:先对边权进行排序,然后二分边权值,建图求从1到n的最大流,当最大流为t时便求出答案。 代码:#include#include#include#includeusing namespace std;#define N 210int n,m,t;int a原创 2013-08-30 10:56:51 · 537 阅读 · 0 评论 -
hdu 3549最大流Ford-Fulkerson算法
Ford-Fulkerson算法戳戳http://www.cnblogs.com/luweiseu/archive/2012/07/14/2591573.html Ford-Fulkerson方法依赖于三种重要思想:残留网络,增广路径和割。Ford-Fulkerson方法是一种迭代的方法。开始时,对所有的u,v∈V有f(u,v)=0,即初始状态时流的值为0。在每次迭代中,可通过寻找转载 2013-08-29 17:06:38 · 690 阅读 · 0 评论 -
poj 3648 2-SAT建图+topsort输出结果
其实2-SAT类型题目的类型比较明确,基本模型差不多是对于n组对称的点,通过给出的限制条件建图连边,然后通过缩点和判断冲突来解决问题。要注意的是在topsort输出结果的时候,缩点后建图需要反向连边,然后输出就可以了。2-sat题型差不多。 题意:新娘新郎分别坐在长桌两边,n-1队夫妇来参加婚礼,要求:夫妇不能坐在同一边,通奸关系不能坐在同一边。输出新娘对面的序列。 思路:对称关系原创 2013-08-28 19:45:31 · 649 阅读 · 0 评论 -
poj 3683 2-sat建图+拓扑排序输出结果
发现建图的方法各有不同,前面一题连边和这一题连边建图的点就不同,感觉这题的建图方案更好。题意:给出每个婚礼的2个主持时间,每个婚礼的可能能会冲突,输出方案。思路:n个婚礼,2*n个点,每组点是对称的,用O(n2)的方法判断每个点之间的关系来建图,然后通过拓扑排序输出即可。代码:#include#include#includeusing namespac原创 2013-08-28 10:35:37 · 730 阅读 · 0 评论 -
poj 2723 二分+2-sat判定
题意:给出n对钥匙,每对钥匙只能选其中一个,在给出每层门需要的两个钥匙,只要一个钥匙就能开门,问最多能到哪层。 思路:了解了2-SAT判定的问题之后主要就是建图的问题了,这里建图就是对于2*n个钥匙,分别分成a和a'两组,即选了比如a,b一组钥匙,选择了a则必须选择b',那么进行连边,而对于每层门,若该门能开,且选择了a',则b肯定需要选,那么a'和b连边。最后就是判定了,同样的 若a与a原创 2013-08-25 20:24:12 · 524 阅读 · 0 评论 -
poj 3694双联通缩点+LCA
题意:给你一个无向连通图,每次加一条边后,问图中桥的数目。 思路:先将图进行双联通缩点,则缩点后图的边就是桥,然后dfs记录节点深度,给出(u,v)使其节点深度先降到同一等级,然后同时降等级直到汇合到同一个点为止。途中直接进行删边处理且桥的数目减少。 代码:#include#include#include#includeusing namespace std;原创 2013-08-25 09:48:29 · 537 阅读 · 0 评论 -
poj 1986LCA离线dfs+并查集
题意,给出边和权值,求出两个点间的最短距离。 用离线算法的时候有个地方不知道怎么处理了。 代码:#include #include #include #include using namespace std;const int NN=100010;int n,m;vector > edge[NN],qe[NN];vector q1,q2;原创 2013-08-24 10:17:37 · 740 阅读 · 0 评论 -
poj 3592 缩点+SPFA
题意:给出一个矩阵,其中#代表墙,不可走,0-9代表权值,*代表可以选择传送。求从0,0点开始出发能获得最大权值。 思路:因为*的出现会有环的情况,先建图连边,将环进行Tarjan缩点,之后再从0,0用SPFA找最长路就行了。 麻烦的地方在于建图,还有各种错 代码:#include#include#includeusing namespace std;#原创 2013-08-11 12:00:30 · 1111 阅读 · 0 评论 -
poj 3621 二分+spfa
题意:给出一个有向图,问求一个回路,使得回路上的点权之和/边权之和最大。这题主要是分析出如何确定ans值。我们将(a1*x1+a2*x2+..+an*xn)/(b1*x1+b2*x2+..+bn*xn)=L,转换为:x1*(a1-b1*L)+x2*(a2-b2*L)+...xn*(an-bn*L)=0则每次枚举L的值,spfa中边权值为len[]*L-a[],若存在负环回路(即一个点访原创 2013-07-29 17:23:56 · 431 阅读 · 0 评论 -
POJ 2449 Dijstra + A* K短路
这题一开始的思路应该是直接从源点进行BFS搜索K短路。但这样的复杂度在点数和K的值增大后将会变得很大。而A*算法则构造一个h(x),在进行BFS时,每次都抛出最小的h(x)从而使汇点的出队速度加快。这题则是先进行一次Dijstra求出每个点到汇点的最短路h(x)从而在优先队列中抛出最小的f(x)A*算法就是启发式搜索,基本形式就是这样:f(x)=g(x)+h(x);其中f(x)代表转载 2013-07-18 10:21:33 · 516 阅读 · 0 评论 -
hdu2426 二分最优匹配KM算法
这题。。。。很明显的二分匹配。但是要注意没有匹配上的情况。由于学生和宿舍时一一匹配,则需要n同时,在求KM算法中要判断是否能完备匹配,即在找d的时候,判断是否能找到。注意图的初始化为负无穷。代码:#include#include#include#includeusing namespace std;#define CLR(arr, what) memset(原创 2013-06-03 22:06:31 · 611 阅读 · 0 评论 -
poj 1860 Bellman_ford
总结bellman_ford算法:主要考虑到带负权边的图,这样的图,对于存在负权边时无法用dfs,prim等求最短路的。因为每次更新不能确定是否有正值与负值相加得出错误的最短路径的点。bellman_ford就可以解决这个问题。判断方法:若图不存在负权值的时候,每一次做全部边的松弛操作(判断src->j的长度是否大于src-->i+i-->j的长度)则可至少确定一个点的最短路径。则原创 2012-12-15 21:29:14 · 646 阅读 · 0 评论 -
SPFA算法
/*SPFA(Shortest Path Faster Algorithm) [图的存储方式为邻接表]是Bellman-Ford算法的一种队列实现,减少了不必要的冗余计算。算法大致流程是用一个队列来进行维护。 初始时将源加入队列。 每次从队列中取出一个元素,并对所有与他相邻的点进行松弛,若某个相邻的点松弛成功,则将其入队。 直到队列为空时算法结束。它可以在O(kE)的时间复杂度转载 2012-12-15 21:59:30 · 386 阅读 · 0 评论 -
1511 基础spfa
题意,求0点到N-1点的来回最短路。这题是基础spfa题:坑爹的用了一个下午的时间弄,这题的输入居然要用scanf,为啥没hit提示呢,以后遇到TLE就要考虑是否输入的问题了。总结下spfa算法,比较高效的算法,有点繁琐,主要是利用了邻接表和队列的形式,与bfs很像。同时可以利用入队次数到达V判断是否有负环。spfa优化算法在这题用不着。。 #include#inc原创 2012-12-16 17:26:36 · 531 阅读 · 0 评论 -
poj 1125 基础Floyd
以后还是不把原题贴出来了。就说大意。题意:给出股市经纪人个数n,消息经过每个人需要一定时间,给出不同人之间消息传输的时间,求出从哪个人开始传输消息能最快传遍所有人。思路:多源的最短路,Floyd!。第一次做FLOYD:总结算法核心for k-nfor i-nfor j-n map[i][j]=min(map[i][j],map[i][k]+map[k][j])原创 2012-12-12 17:17:29 · 471 阅读 · 0 评论 -
poj2253 Dijkstra变形
DescriptionFreddy Frog is sitting on a stone in the middle of a lake. Suddenly he notices Fiona Frog who is sitting on another stone. He plans to visit her, but since the water is dirty and full of原创 2012-12-09 21:49:27 · 1632 阅读 · 0 评论 -
hdu1874 Dijkstra 最短路
某省自从实行了很多年的畅通工程计划后,终于修建了很多路。不过路多了也不好,每次要从一个城镇到另一个城镇时,都有许多种道路方案可以选择,而某些方案要比另一些方案行走的距离要短很多。这让行人很困扰。现在,已知起点和终点,请你计算出要从起点到终点,最短需要行走多少距离。 Input本题目包含多组数据,请处理到文件结束。每组数据第一行包含两个正整数N和M(0接下来是M原创 2012-12-04 22:15:17 · 638 阅读 · 0 评论 -
poj2485 kruskal与prim
DescriptionThe island nation of Flatopia is perfectly flat. Unfortunately, Flatopia has no public highways. So the traffic is difficult in Flatopia. The Flatopian government is aware of this problem原创 2012-12-09 15:16:01 · 2578 阅读 · 0 评论 -
Kruskal Prim Dijkstra
这三个算法每本算法书都要讲到,这次看《算法之道》又复习了一遍,觉得有些新的领悟,写个模板记录一下。 Kruskal和Prim算法解决的问题都是最小生成树问题,即对于一个图G,找到它的最小生成树T,其中E'包含于E,使得所有V都连通。Dijkstra算法解决的是单源多点最短路径问题,即对于一个图G和一个起点S,为图中的其它所有节点找到距离S最近的路径。所说的图都是加权图,如果是均权图或者权重为一的图转载 2012-12-08 16:42:22 · 601 阅读 · 0 评论 -
最短路径 之 Dijkstra算法
Dijkstra算法又称为单源最短路径,所谓单源是在一个有向图中,从一个顶点出发,求该顶点至所有可到达顶点的最短路径问题。 设G=(V,E)是一个有向图,V表示顶点,E表示边。它的每一条边(i,j)属于E,都有一个非负权W(I,j),在G中指定一个结点v0,要求把从v0到G的每一个接vj(vj属于V)的最短有向路径找出来(或者指出不存在)。 Dijstra算法是运用贪转载 2012-12-04 13:18:38 · 1123 阅读 · 0 评论 -
poj3625 最小生成树 Prim
DescriptionFarmer John had just acquired several new farms! He wants to connect the farms with roads so that he can travel from any farm to any other farm via a sequence of roads; roads already原创 2012-12-04 11:23:31 · 979 阅读 · 0 评论