随笔分类 -  图论 - 二分图

摘要:题目大意:对于一个顺序序列,求一个合法置换,可以满足一些约束,若存在多个合法置换,则输出字典序最小的一个置换。 题解:对于序列的置换是否有解的问题,可以和二分图的完美匹配相关联。由于是字典序最小,显然需要贪心考虑。在匈牙利算法执行的过程中,对于每个点来说,可以优先匹配符合条件的最小的点;对于左边点集 阅读全文
posted @ 2019-04-27 16:51 shellpicker 阅读(106) 评论(0) 推荐(0)
摘要:题目大意:给定一个 N N 的矩阵,有些格子是 1,其他格子是 0。现在允许交换若干次行和若干次列,求是否可能使得矩阵的主对角线上所有的数字都是1。 题解:首先发现,交换行和交换列之间是相互独立的。主对角线上是 1 意味着每行都对应着相应的列。现在考虑 1 是行和列之间的边,若对于这张二分图存在一个 阅读全文
posted @ 2019-04-26 12:50 shellpicker 阅读(259) 评论(0) 推荐(0)
摘要:题目大意:给定 N 个点和一些有向边,求是否能够将这个有向图的点分成两个集合,使得同一个集合内的任意两个点都有双向边联通。 题解:反向思考,对于没有双向边的两个点一定不能在同一个集合中。因此,构建一个图,若两点之间有边,则表示这两个点不能在同一个集合中。进行二分图染色判定即可,若是二分图,则满足条件 阅读全文
posted @ 2019-04-25 19:43 shellpicker 阅读(246) 评论(0) 推荐(0)
摘要:题目大意:给定一个 N\ M 的棋盘,有一些格子禁止放棋子。问棋盘上最多能放多少个不能互相攻击的骑士(国际象棋的“骑士”,类似于中国象棋的“马”,按照“日”字攻击,但没有中国象棋“别马腿”的规则)。N, M define fi first define se second define pb pus 阅读全文
posted @ 2019-04-03 21:10 shellpicker 阅读(418) 评论(0) 推荐(0)
摘要:题目大意:给定一个 N\ M 的图,图中有一些格子不能被任何东西覆盖,现有一些宽度为 1,长度任意的骨牌覆盖这些可以被覆盖的格子,骨牌之间可以重叠,求将所有可以被覆盖的格子覆盖所需的最小骨牌数是多少。 题解:一行连续的可覆盖格子或一列连续的可覆盖格子一定是一起被覆盖的,因此预处理出每一个格子在哪些行 阅读全文
posted @ 2019-04-02 12:32 shellpicker 阅读(183) 评论(0) 推荐(0)
摘要:题目大意:给定 N 个任务和两台机器,每个任务可以在任意一台机器上执行,每台机器有 N 个启动状态,不同任务需要机器在不同的状态下执行,求执行所有任务需要多少个不同的状态。 题解:由于一个任务一定要被两台机器中的一台执行,可以将任务看作边,连接两台机器的对应启动状态。所要求的是这个二分图的最大独立集 阅读全文
posted @ 2019-04-02 11:41 shellpicker 阅读(195) 评论(0) 推荐(0)
摘要:题目大意:给定 N 座塔,M 个怪物,每座塔一次可以发射一枚导弹,发射导弹有发射时间和冷却时间,每座塔和每只怪物有自己的二维坐标,所有导弹有一个共同的速度,求至少需要多长时间才能将所有怪物消灭。 题解:考虑若在 x 的时间可以消灭所有怪物,则大于 x 的时间也一定可以消灭所有怪物,因此考虑二分答案。 阅读全文
posted @ 2019-04-02 08:14 shellpicker 阅读(429) 评论(0) 推荐(1)
摘要:题目大意:给定一个 N\ M 的棋盘,棋盘上有些点不能放置任何东西,现在在棋盘上放置一些车,问最多可以放置多少个车而不会互相攻击。 题解:将放置一个车看作连接一条无向边,因为每一行和每一列之间只能放置一个车,即:车的位置在 (i,j) 时,表示第 i 行和第 j 列之间放置了一个车。可以发现,一个车 阅读全文
posted @ 2019-04-01 21:55 shellpicker 阅读(223) 评论(0) 推荐(0)
摘要:题目大意:给定一个 N\ N 的棋盘,棋盘上有些位置不能防止任何东西,现用 1\ 2 的骨牌填充棋盘,问最多能铺多少块骨牌。 题解:由于骨牌只能覆盖相邻的两个格子,那么按照对角线进行划分的格子可以保证一定不会被骨牌覆盖。因此,可以将骨牌看成边,每个格子可以与周围的四个合法的格子建立边。每个对角线上的 阅读全文
posted @ 2019-04-01 21:27 shellpicker 阅读(262) 评论(0) 推荐(0)
摘要:题目大意:给定一个二分图,求该二分图的最大匹配数。 题解:学到了匈牙利算法。 匈牙利算法是基于一种贪心的思想,即:对于二分图左边集合中的每一个节点,遍历与之相连的所有边,若找到一个右边集合中的没有匹配的点,则直接进行匹配即可;若右边集合中存在一个已经有匹配的点,那么则考虑协商,即:让右边集合中匹配的 阅读全文
posted @ 2019-04-01 20:36 shellpicker 阅读(159) 评论(0) 推荐(0)