图论
vufw_795
Mood decides everything.
展开
-
sicily_1150 & sicily_1151
宽搜 + 康托展开 两题其实是一样的两道题,可以训练宽搜,但是,这两题作为宽搜其实是水题,比较难的地方其实是对状态的记录,即队列的元素采用什么来保存,这里用到了康托展开(介绍点这儿) 解决了保存的问题,接下来的都是琐事了,上代码://sicily 1150 简单魔板#include <bits/stdc++.h>using namespace std;int n,m,goal,tmp[10],原创 2015-02-18 14:38:57 · 459 阅读 · 0 评论 -
UVA 11478(差分约束系统)
题目链接:UVA 11478解题思路: 题目要求使所有的边权值为正且尽量大,可以很自然地想到最大值最大化的经典解法——二分法。我们需要二分地去寻找答案,判断答案是否合理可以通过构建差分约束系统解决。 我们假设在第 i 个点上进行的权值操作为sum[i],那么所有 i 的出边都增加sum[i],入边都减少sum[i],因为每条边本身有权值,我们要满足权值增减之后所有边权为正,即满足等式sum[i]原创 2016-04-07 18:04:02 · 982 阅读 · 0 评论 -
差分约束系统(入门)
简介: 如果一个系统由n个变量和m个约束条件组成,其中每个约束条件形如xj-xi<=bk(i,j∈[1,n],k∈[1,m]),则其为差分约束系统(system of difference constraints)。亦即,差分约束系统是关于一组变量的特殊不等式组。求解差分约束系统,可以转化成图论的单源最短路径问题。 观察xj-xi<=bk,会发现它类似最短路中的三角不等式d[v]<=d[u]+w原创 2016-03-04 12:08:06 · 811 阅读 · 0 评论 -
UVALIVE 3523(双连通分量+二分图染色)
题目链接:UVALIVE 3523解题思路: 这题是一道神题,考察的内容非常综合! 这题最终转化为求解图中结点是在一个奇圈上。首先我们可以把所有的圈找出来,即找到所有的双连通分量,跑一边tarjan算法即可。之后重头戏来了,我们获得一个双连通块之后,怎么判断块中的点是不是在一个奇圈上?答案——二分图染色! 定理:一个图为二分图的充分必要条件是图中不存在奇圈。 因此,如果一个双连通块为二分图,原创 2016-04-08 10:21:21 · 1063 阅读 · 2 评论 -
UVA 10972(边双连通分量)
题目链接:UVA 10972解题思路: 这题的题意很简单,就是给一个无向图,然后要求我们把所有的边都变成有向边,然后再另外添加一些有向边,最终用最少的边把有向图变成强连通的。一眼看过去是懵比的,然而仔细一想,转化后的有向图强连通即原图边双连通啊,于是题目转化成添加最少的边把原图变成边双连通图。先跑一遍Tarjan算法后缩点统计度为0和1的结点即可。代码:#include <vector>#inc原创 2016-05-03 23:19:51 · 1108 阅读 · 0 评论 -
UVALIVE 4452(2-SAT变形)
题目链接:UVALIVE 4452解题思路: 题意大概这样,n个人对m个方案进行投票,每个人最多对m个方案中的4个投票,要么支持,要么反对,问是否存在一个最终决定,能够让每个投票人都有一半以上的建议被采纳。这题的题意有一个比较不清晰的地方,就是什么叫超过一半,其实就是投1个或2个方案的时候,全部建议都被采纳;投3个或4个方案时,最多一个建议没有被采纳。输出要求先判断是否存在满足要求的最终决定,在能原创 2016-05-04 20:10:00 · 829 阅读 · 0 评论 -
最小瓶颈路与次小生成树
简介: 最小生成树是图论里面一类经典问题,可以有很多种变形,其中最小瓶颈路和次小生成树就是两种比较经典的变形。最小瓶颈路就是在两个结点之间求一条最长边最短的路径,而次小生成树则是所有生成树中权值排名第二的生成树(可以和最小生成树相等)。下面我们分别来看看这两个问题。最小瓶颈路: 给定一个加权无向图,并给定无向图中两个结点u和v,求u到v的一条路径,使得路径上边的最大权值最小。这个问题可以稍微加强原创 2016-05-06 14:00:41 · 7993 阅读 · 0 评论 -
匹配极其相关问题(一)
简介: 匹配问题是图论中一类非常经典的问题,最经典、常见的有二分图最大匹配和二分图最大权匹配,分别可以使用匈牙利算法与KM算法较高效解决。另外,匹配问题通常与支配集、覆盖集、独立集相关联,我们可以通过转化问题,将这些问题转化成匹配问题后套用算法解决。下面先介绍一些基本概念。基本概念: 匹配问题通常与支配集、覆盖集、独立集等问题相关,下面分别介绍五个基本概念。 1、点支配集: 对无向图G=(V原创 2016-04-05 11:09:13 · 826 阅读 · 0 评论 -
Tarjan三大算法之双连通分量(割点,桥)
Robert Endre Tarjan是一个美国计算机学家,他传奇的一生中发明了无数算法,统称为Tarjan算法。其中最著名的有三个,分别用来求解 1) 无向图的双连通分量 2) 有向图的强连通分量 3) 最近公共祖先问题 接下来几篇博客将分别讲述三个算法,首先是无向图的双连通分量,我们先从无向图的割点和桥讲起。下面介绍中无向图中割点和桥的概念: 割点:一个结点称为割点(或者割顶)当原创 2016-04-23 11:25:35 · 11459 阅读 · 4 评论 -
Tarjan三大算法之强连通分量
简介: 在之前的两篇博客中,我们详细介绍了Tarjan大牛发明的用来求解割点、桥和双连通分量的算法,这次我们介绍一下强连通分量。算法: 这次的Tarjan算法,可以用一次DFS把所有强连通分量找出来,依旧是用两个时间戳和栈来实现。算法的大体思路还是在深搜过程中更新时间戳,并将遍历过的结点保存在栈中,之后通过对时间戳的判断,来发现强连通分量。当我们完成对一个结点u以及其子孙的访问后,我们可以进行一原创 2016-05-07 22:21:41 · 1861 阅读 · 0 评论 -
匹配极其相关问题(四)
前言: 之前已经介绍了最小点覆盖与最大点独立,那么接下来就应该是最小边覆盖问题了。最小边覆盖问题有很多变种,其中最常见的就是DAG上的最小路径覆盖,这种问题可以转化成二分图最大匹配解决。基本定理: 根据博客(一),有定理如下: 定理4:二分图中,无孤立点,点独立数=边覆盖数=N-边独立数 若存在M个孤立点,上述定理3、4在顶点数N扣除M后成立。 定理7:无向图中,无孤立点, 1)若原创 2016-04-06 23:21:56 · 538 阅读 · 0 评论 -
强连通分量的tarjan算法应用(一)
题目链接:POJ 2186解题思路: 先用tarjan算法求出图中的强连通分量,再求出缩点后唯一的叶结点即可。代码:#include <vector>#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;int n,m,dfn[100005],low[100原创 2016-02-23 16:24:29 · 853 阅读 · 0 评论 -
sicily 1140(搜索)
题目链接:sicily 1140解题思路:贪心+深搜 相当考编程能力的一道题,一个手贱就卡了好几天,不过的确是一到好题。考察的是对贪心法的运用,还有编程能力——深搜。贪心原则是从最小结点开始搜索(这样最小结点就是根结点),然后对于每一个结点,搜索返回结点数和最小结点,根据题意比较结果,每次贪心搜索之后删除那条边,并标记整个子图,再继续搜索,直到所有的人都分到遗产。代码:(有可能冗余很多,但都是测试原创 2015-04-03 19:48:43 · 682 阅读 · 0 评论 -
强连通分量——kosaraju算法
kosaraju算法,三大强连通分量算法之一,最简单、最好理解的求解有向图强连通分量的方法,单纯的两次深搜,就可以划分我们的图。算法流程: 1、从任意一个点开始深搜,得到图的一个最晚完成时间的排序; 2、求图的反图; 3、根据第1步得到的排序,从最晚完成的一个点开始搜索并染色; 4、第三步每一次深搜完成就是一个强连通分量。 下面进行算法的具体分析。算法思想: 其实这个算法是由两原创 2015-05-13 13:26:37 · 2606 阅读 · 0 评论 -
kosaraju算法应用(一)
题目链接:POJ 2186解题思路: kosaraju算法,本以为要缩点,但是题目只要求找到拓扑排序的一个唯一的头,可以水过——通过计算强连通分量的出度。代码:#include <cstdio>#include <vector>#include <cstring>#include <iostream>#include <algorithm>using namespace std;int n原创 2015-05-23 15:54:31 · 996 阅读 · 0 评论 -
POJ 1094(拓扑排序)
题目链接:POJ 1094解题思路: 基本的思路就是拓扑排序算法。需要注意的是环的判断优先于排序是否唯一的判断。代码:#include <queue>#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;int n,m,a[30][30],degree[30原创 2016-02-14 00:59:46 · 666 阅读 · 0 评论 -
POJ 2195(二分图最大权匹配)
题目链接:POJ 2195解题思路: 这题可以转化成权匹配或者费用流问题。首先需要根据输入构图,将问题转成权匹配问题,之后套用KM算法即可。KM算法入门很好的一道题目。代码:#include <cmath>#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#define INF 0x3f3f原创 2016-02-21 21:13:31 · 949 阅读 · 0 评论 -
UVA 10537(最短路)
题目链接:UVA 10537解题思路: 这题是大白书上的最短路例题,应用情景非常经典。首先我们在计算最短路的时候需要从终点算起,因为图中边的权值是变化的;计算的方法是一个坑,大概就是对于一个整数N,求一个整数M,使得N=M−⌈M/20⌉N=M-\lceil M/20\rceil式子是这样的M=⌈19N/20⌉M=\lceil 19N / 20 \rceil,公式的得出需要先考虑M可以被20整除的情原创 2016-04-03 21:47:27 · 1289 阅读 · 0 评论 -
UVA 11090(SPFA判负环)
题目链接:UVA 11090解题思路: 这题需要使用二分法来解决,思路类似与最大值最小化问题,我们可以把求解最小均值环的问题转化成判断负环的问题。二分的过程中,我们可以每次猜想一个最小值,然后使所有的边的权值减去这个最小值,若存在负环,则这个值太大了,最小值需要减小,否则增加。判断负环可以使用Bellman-Ford算法的优化算法,SPFA算法解决。代码设计: 因为最小均值可以为浮点数,而且只需原创 2016-04-04 14:02:40 · 900 阅读 · 0 评论 -
匹配及其相关问题(二)
前言: 很久之前学的一个算法,然而昨天发现我已经完全不记得原理了。上周末去打补选赛,看到一堆时间复杂度没救的图论题,心灵受到了成吨的伤害。老师说算法设计要考网络流,如果不学学二分图匹配的话估计又要GG了。简介: 匈牙利算法,由匈牙利数学家Edmonds与1965年提出,属于比较早期的一个算法。算法的核心在于寻找增广路径,是一种用增广路径求解二分图最大匹配的算法。情景说明: 我们首先给出问题的具原创 2015-12-31 21:22:02 · 965 阅读 · 0 评论 -
匹配及其相关问题(三)
前言: 第二篇博客介绍了匈牙利算法解二分图最大匹配,这次我们需要应用这个算法来解决最小点覆盖与最大点独立问题。基本定理: 根据博客(一),我们有以下定理: 定理3:二分图中,无孤立点,点覆盖数=边独立数(匹配数) 定理8:无向图中,无孤立点,最小点覆盖集与最大点独立集互补 我们这次需要使用这两个定理来解决最小点覆盖与最大点独立问题。算法思路: 根据定理3,我们有点覆盖数等于匹配数,那么原创 2016-04-05 22:24:08 · 583 阅读 · 0 评论 -
Tarjan三大算法之双连通分量(双连通分量)
定义: 对于一个连通图,如果任意两点至少存在两条点不重复路径,则称这个图为点双连通的(简称双连通);如果任意两点至少存在两条边不重复路径,则称该图为边双连通的。点双连通图的定义等价于任意两条边都同在一个简单环中,而边双连通图的定义等价于任意一条边至少在一个简单环中。对一个无向图,点双连通的极大子图称为点双连通分量(简称双连通分量),边双连通的极大子图称为边双连通分量。这篇博客就是总结一下求解无向图原创 2016-05-03 16:18:43 · 21857 阅读 · 10 评论