图论
Jaster_wisdom
程序员
展开
-
POJ 1251 (最小生成树)
很明显,这是一道 最小生成树的例子。也就是,从图中选取若干条边将所有顶点连接起来,并且所选取的这些边的权值之和最小。算法:Prim算法,或者 Kruskal算法Prim算法: 首先选择一个点为起点,然后找到与该边相邻权值最小的边,选中该边上的另一个点,然后选择 与选中点 相连接的最小边,这样循环下去,直到包含所有节点用d[i]表示 与 i 点相邻的最短边的权值,这点是与 Dijks原创 2016-03-16 10:30:17 · 979 阅读 · 0 评论 -
二分图的最大匹配(匈牙利算法)
这篇文章讲无权二分图(unweighted bipartite graph)的最大匹配(maximum matching)和完美匹配(perfect matching),以及用于求解匹配的匈牙利算法(Hungarian Algorithm);不讲带权二分图的最佳匹配。二分图:简单来说,如果图中点可以被分为两组,并且使得所有边都跨越组的边界,则这就是一个二分图。准确地说:把一个图的顶点划分为转载 2016-03-26 15:02:40 · 824 阅读 · 0 评论 -
POJ 1422 (最小路径覆盖)
题目大意:给定街道数量和交叉路口数量,以及每条路口之间有向连接,空降伞兵在岔路口,每个岔路口最多一个伞兵,伞兵可以沿着有向街道走,但是每个路口只能经过一个伞兵,问最少需要多少个伞兵才能将各个岔路口都访问到?这是一道最小路径覆盖的题目最小路径覆盖数 = 顶点数目 - 最大匹配边数关键就是 求 最大匹配边数这里用匈牙利算法。用DFS或者BFS不断的寻找增广路,找到一条的路,匹配的数原创 2016-03-26 15:04:07 · 764 阅读 · 0 评论 -
POJ 2594 (最小路径覆盖+可重点)
这是一道典型的二分匹配的题目,问的是最少需要多少个机器人可以将点全部覆盖。每个机器人散落在一个点上,每个机器人不能走回路。公式:最小路径覆盖数 = 顶点数 - 最大匹配数最大匹配数用匈牙利算法可求的。这里的关键是 每个机器人可以走过相同的点,也就是意味着 就算i和j没有边直接相连,但是如果它们都连着k的话,它们之间也可以达到。这里很明显可以用 Floyd算法,三重循环!原创 2016-03-26 22:13:15 · 535 阅读 · 0 评论 -
求强连通分量的双DFS,Tarjan和Gobow算法详解
1.强连通分量-----双DFS算法思想:对一个有向图作两遍DFS,第一遍DFS能确定图中每个顶点的DFS完成时间,第二遍DFS从第一遍DFS完成时间的逆序开始遍历。思想:对一个有向图作两遍DFS,第一遍DFS能确定图中每个顶点的DFS完成时间,第二遍DFS从第一遍DFS完成时间的逆序开始遍历,这时得到的一棵棵深度优先搜索树就是一个个对应的强连通分量。举例:转载 2016-04-09 10:42:31 · 2539 阅读 · 0 评论 -
POJ 1325 (最小覆盖数)
题目大意: 有两类机器A,B,它们分别有m和n类工作模式,现在有k个任务,每个任务可以选择机器A的某个模式 或者 选择机器B的某个模式,模式之间的转换 需要重启,问最少需要几次重启 可以将任务 全部做完?思路:首先建图,画两个集合X,Y,分别存放A和B的工作模式,若任务i 既可以用A的模式1解决,又可以用B的模式2解决,那么将X中的1和Y中的2相连,我们可以发现,只要选择了一个模式原创 2016-03-28 17:13:48 · 705 阅读 · 0 评论 -
图的广度遍历 (算法导论 345页)
最近,做了几道关于图的题目,略感生疏。准备看看算法导论复习一下。说到基本的图算法,那就必然会提高图算法的核心-搜索,经典的 广度搜索BFS 和 深度搜索DFS形象点说,前者就是 水面上泛起的 涟漪,一层一层注重广度;而后者 就是 打洞,往深里去,打完一个洞,再打另一个洞。 算法导论,第22章基本图算法,广度遍历,我看了下书里面的例子,觉得挺好,下面自己实现了一下,写的简单了些,大神勿喷。原创 2016-03-28 20:38:04 · 460 阅读 · 0 评论 -
第六次CCF计算机软件能力认证考试(第四题)
问题描述 某国有n个城市,为了使得城市间的交通更便利,该国国王打算在城市之间修一些高速公路,由于经费限制,国王打算第一阶段先在部分城市之间修一些单向的高速公路。 现在,大臣们帮国王拟了一个修高速公路的计划。看了计划后,国王发现,有些城市之间可以通过高速公路直接(不经过其他城市)或间接(经过一个或多个其他城市)到达,而有的却不能。如果城市A可以通过高速公路到达城市B,而且城市B也可以原创 2016-04-11 16:25:25 · 1663 阅读 · 0 评论 -
网络延时 201503-4
问题描述 给定一个公司的网络,由n台交换机和m台终端电脑组成,交换机与交换机、交换机与电脑之间使用网络连接。交换机按层级设置,编号为1的交换机为根交换机,层级为1。其他的交换机都连接到一台比自己上一层的交换机上,其层级为对应交换机的层级加1。所有的终端电脑都直接连接到交换机上。 当信息在电脑、交换机之间传递时,每一步只能通过自己传递到自己所连接的另一台电脑或交换机。请问,电脑与电脑原创 2016-04-21 12:08:26 · 504 阅读 · 0 评论 -
拓扑序列 C++实现
有向无环图,就是不存在回路的有向图。我们如何判断有向图是否有回路?一般来说,如果该图存在拓扑序列并且能输出所有结点,那么可以证明该图无回路,否则该图有回路该版本C++的实现采用栈来实现,将入度为0的结点不断入栈,每次弹出栈顶元素,直到栈内为空。弹出一个元素后,将它指向的其他节点的入度减1,不断重复这一过程。#include #include #include #include #i原创 2016-05-17 22:48:58 · 2437 阅读 · 0 评论 -
九度OJ 1008 最短路径问题
题目描述:给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的。输入:输入n,m,点的编号是1~n,然后是m行,每行4个数 a,b,d,p,表示a和b之间有一条边,且其长度为d,花费为p。最后一行是两个数 s,t;起点s,终点t。n和m为0时输入结束。(1输出:输出原创 2016-06-27 21:58:13 · 1604 阅读 · 0 评论 -
九度OJ 1012 畅通工程 (深度遍历求强连通分量个数)
题目描述: 某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇。省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可)。问最少还需要建设多少条道路?输入: 测试输入包含若干测试用例。每个测试用例的第1行给出两个正整数,分别是城镇数目N ( 注意:两个城市之原创 2016-06-19 11:16:00 · 1112 阅读 · 0 评论 -
九度OJ 1109 连通图
题目描述: 给定一个无向图和其中的所有边,判断这个图是否所有顶点都是连通的。输入: 每组数据的第一行是两个整数 n 和 m(0输出: 对于每组输入数据,如果所有顶点都是连通的,输出"YES",否则输出"NO"。样例输入:4 31 22 33 23 21 22 30 0样例输出:NO原创 2016-08-07 10:54:57 · 696 阅读 · 0 评论 -
九度OJ 1091 棋盘游戏
题目描述: 有一个6*6的棋盘,每个棋盘上都有一个数值,现在又一个起始位置和终止位置,请找出一个从起始位置到终止位置代价最小的路径: 1、只能沿上下左右四个方向移动 2、总代价是没走一步的代价之和 3、每步(从a,b到c,d)的代价是c,d上的值与其在a,b上的状态的乘积 4、初始状态为1 每走一步,状态按如下公式变化:(走这步的原创 2016-08-07 15:28:22 · 577 阅读 · 0 评论 -
LeetCode200. 求岛屿的个数
给定一个由 '1'(陆地)和 '0'(水)组成的的二维网格,计算岛屿的数量。一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的。你可以假设网格的四个边均被水包围。示例 1:输入:11110110101100000000输出: 1示例 2:输入:11000110000010000011输出: 3题目分析:用DFS求解,即求图中连通分...原创 2018-08-14 13:16:14 · 1132 阅读 · 0 评论 -
POJ 2253
这道题是最短路问题,题目的意思 要好好理解一下。这种题目我觉得Dijkstra算法倒不是什么难点,关键在于按题目要求如何更新边,算法里面是 找最小边还是最大边,题目大意的理解很重要。这道题是要求,一条路上的最大边,并且这条边比其他路上的边都要小。所以,这里是要找 最小边,然后更新边集,如果dis[j]>max(dis[k],map[k][j]),就要进行更新了。原因是,某一条上的最大边 比原创 2016-03-15 16:16:04 · 504 阅读 · 0 评论 -
第六届CCF计算机职业资格认证考试题解(第四题)
题目大意:根据给定的图,找一条欧拉路,并且输出顺序为字典序,找不到就输出-1思路:存在欧拉路的条件是 图中奇数度的个数 有 0 个 或者 2个 (定理)找欧拉路,很容易联想到fleury算法,这是没错的。因为题目中要按字典序输出,只要找到最小的奇数度节点,开始fleury。 输出的话,只要将path 数组倒序输出即可。这里关键的问题,有两个,一是超时的问题,还有空间超的原创 2016-04-05 20:32:13 · 819 阅读 · 0 评论 -
POJ 1258
最小生成树,模板题,直接按照模板来 就可以了。注意:这里程序没有终止条件,就是一直是输入样例。#include using namespace std;#define MAXV 110#define MAX 100010int n;int map[MAXV][MAXV];int d[MAXV];bool vis[MAXV];void Prim(){ i原创 2016-03-16 20:40:59 · 468 阅读 · 0 评论 -
POJ 1469
这是一道 二分图 求最大匹配边 最经典的例子,开始我竟没有看出来。。题目大意是,给定N名学生,P名课程,一名学生可以修任意门课程,要问的是能否在N名学生中找到P个人使他们满足两个条件:每个学生代表一门不同的课程,每门课程由一名学生代表。其实把这两句话 好好咀嚼一下,发现就是 二分图中最大匹配的问题。 匹配的概念是 每个顶点只能由一条边对应。当我们求出课程的最大匹配边数,其实就是求出了 co原创 2016-03-29 19:53:15 · 543 阅读 · 0 评论 -
POJ 1789
题目我咋一看, 觉得有点新颖,后来 读题之后 发现又是 最小生成树的 例子。题目大意:每条字符串 都可以 由其他的字符串 演化出来。定义两个字符串之间的距离,就是它们之间不同的字符的个数。 要求的是, 如何演化,对应的距离之和 最短,相应的 倒数也就是 最大的。我们知道,最小生成树的权值之和是最短的。因为这道题,点的范围是 2~2000,并且构成的图 应该是 密集型的,每两个点之间 都会有原创 2016-03-17 16:59:42 · 384 阅读 · 0 评论 -
POJ 2485
最小生成树的例子。这次求的不是 最小生成树边的权值之和,而是构成最小生成树中 最长的边。不过,无论题目怎么变化,Prim算法的核心思想是 一样的,只要改变一下 最后输出的结果,找边的最大值即可。最后,说一下,这道题目的输出格式。本来没什么要求,可就是题目中说 每个样例 之后空一行,结果我cout#include using namespace std;#define MAXV 5原创 2016-03-17 19:06:53 · 483 阅读 · 0 评论 -
POJ 2446
题目大意:给定一个M*N大小的棋盘,其中的一些点是洞,无法放置卡片,卡片是占两个格子的矩形方块。现在用程序来判断 是否可以用卡片不重叠的 将整个棋盘填满?思路:看到这道题,压根刚开始没想起来用二分图,最大匹配来做。后来看了网上的博客,才有些思路。 首先要明确的是,在棋盘中,[i,j]表示的点如果i+j为偶数,那么周围的四个点的横纵坐标之和一定为奇数,反过来也一样。那么我们就可以原创 2016-03-30 20:00:07 · 524 阅读 · 0 评论 -
POJ 1087
这是一个 网络中的最大流问题的 经典问题。题目:有n个插座,m个电器,k种适配器(a,b),表示插座b可以替代插座a问最少有多少个 电器 充不到电?这道题 可以转换为 求最多可以多少个 电器设备可插入? maxflow那么问题的答案就是 m - maxflow下面就是 如何求最大流 maxflow. 增广路算法:每次用BFS找一条最短的增广路径,然后沿着这条路径原创 2016-03-20 10:30:30 · 663 阅读 · 0 评论 -
POJ 1459
最大流问题,EK算法#include #include #include using namespace std;#define MAX 1<<29;#define MAXV 105int map[MAXV][MAXV],pre[MAXV],vis[MAXV],n;int EK(){ int i,ans=0,now,min; queueq; while原创 2016-03-21 08:41:00 · 490 阅读 · 0 评论 -
最大流问题(EK算法模板)
最近在看 最大流问题,因为是第一次涉及到这种问题,以及第一次接触到这种类型的算法,所以刚开始一头雾水。首先,这种问题概念比较多,残存网络,增广路径,最小割,流量对称,等。 其次,虽然有现成的方法解决,但是解决此方法的算法有多种,优化的算法也有很多。刚开始看 Dinic 匈牙利算法,真心没看懂。。 现在我写了一份模板,是EK算法实现的。应该算最简单的一种实现方法了。我觉得,只要会熟练掌握原创 2016-03-21 08:58:57 · 1231 阅读 · 0 评论 -
POJ 1149
题目:m个猪圈,n个顾客,每个猪圈里面有一定数量的猪,每个顾客有一定的需求量。求最多可以卖出多少条猪?这里注意有一个前提条件,就是一个顾客开了一个猪圈之后,后 面的话,可以将这个猪圈里面的猪 拉到其他猪圈里去。此题关键就是 建立图结构,因为最大流问题,我们可以用 EK 模板来套。此图里面有三层,第一层就是源点,第二层顾客,第三层是汇点。总的来说,源点与顾客连,顾客与汇点连。注意原创 2016-03-21 20:14:07 · 562 阅读 · 0 评论 -
POJ 2524 (并查集)
题目大意:已知一个学校有不同的种族,给定n个人,和m对人,每对人他们的信仰一样,问n个人有多少种信仰?前提是每个人只有一个信仰思路:如果a和b信仰相同,那么他们就属于同一集合。如果a和c相同,那么就把c加入到该集合中,很明显,属于同一集合里面的人信仰相同,那么问题就变成了求这n个人共有多少个集合。 首先,将n个人初始化为n个集合,发现a和b之间信仰相同并且它们之间不构成环的话,集合原创 2016-04-03 21:15:28 · 618 阅读 · 0 评论 -
POJ 1062
这次做的是 最短路问题。 运用 Dijkastra 算法: 将点集 分为两类,一边是访问过的,一边是 未访问的,该算法的终结条件是 所有的点 都访问过。 该算法解决某一点 到 图上 其他各点最短距离的问题。 那么,首先求出这一点到各个点上距离最小的一个点,将其加入到访问过的点集里面去,然后更新初始点到各点的距离,借助的就是刚刚进入vis[] 数组里面的那个点。举例来说的话,就是本来 甲地 到原创 2016-03-10 20:04:57 · 615 阅读 · 0 评论 -
POJ 1129
题目大意:给定一些点,和它们之间的连通关系,要求相邻的点之间信号不同,求出最少需要多少信号?这道题其实是染色问题,可以参照 图论里面的 四色定理(即只要四种颜色就可以将一幅地图染色,要求是相邻的各块面积颜色不同)所以这道题最大值就是4因为此题最多也就26个点,所以暴力搜索dfs,也可以accept#include#include#includeusing namespac原创 2016-02-27 15:54:26 · 662 阅读 · 0 评论 -
POJ 1125
题目大意:以各点为源,比较每次Dijkstra算法求出的值,求出最小值。如果图不连通,输出 Disjoint。#include using namespace std;#define MAX 1<<29int n;bool vis[101];int dis[101][101];int d[101]; //表示到各点的最短距离int dijkstra(int start)原创 2016-03-12 15:02:13 · 688 阅读 · 0 评论 -
欧拉路 (Fleury算法)
欧拉路 就是 一条路径,它满足这样的条件,走过图中的每条边,顶点经过次数不限。下面说一下关于欧拉路的定理,说来惭愧,殷剑宏老师教的离散数学几乎都忘光了,现在用到的时候才翻开课本,发现全是书上的定理。图中存在欧拉路,必须满足下面两个条件之一:1.图中所有点的度数都为偶数2.图中只有两个点的度数为奇数至于Fleury的算法思想,我就不想写了,网上都有,反正我没有看懂。。图论原创 2016-04-05 19:07:34 · 3980 阅读 · 1 评论 -
LeetCode207. 课程表
现在你总共有 n 门课需要选,记为 0 到 n-1。在选修某些课程之前需要一些先修课程。 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们: [0,1]给定课程总量以及它们的先决条件,判断是否可能完成所有课程的学习?示例 1:输入: 2, [[1,0]] 输出: true解释: 总共有 2 门课程。学习课程 1 之前,你需要完成课程 0。所以这是可能...原创 2018-08-14 19:37:44 · 605 阅读 · 0 评论