二分图

CF-1012B Chemical table(二分图,并查集)

谁都会走 提交于 2019-11-28 09:54:52
原题连接 : 题意 :给一个 \(N \times M\) 棋盘 对于任何一个棋盘中的由任意四点构成的矩形,如果 其中三角存在棋子 则第四个角会自动生成一个棋子 求铺满整个棋盘 我们至少要向棋盘里加多少枚棋子 思路 :说实话一开始很不容易去想如何去解决。存在两点,即到底所给出的棋子能最多推出哪些新的棋子,以及到底怎样最少补棋子能够使得棋盘补完。 我们可以先分析一下三个棋子形成四个棋子的关系: 已知三点 \((x_1,y_1)\) \((x_1,y_2)\) \((x_2,y_1)\) 则可以推出第三个棋子 \((x_2,y_2)\) ,我们知道两个点连接成的一条边已经固定了矩形另一条边的 \(x\) 或者 \(y\) 坐标 即选择的行列会有传递连接关系。 \((x_1,y_1)\) 即 \(x_1\) 连接 \(y_1\) ,在将 \((x_1,y_2)\) 放进去即 \(x_1\) 连接 \(y_2\) 这样 \(x_1,y_1,y_2\) 三个点就被确定了。所以如果做过以前的二分图就会更好想这个连接关系。我们把这个矩阵转换成两个图 把每行用一个下标表示,每列用一个下标表示。我们要把所有的点都表示完即是要将 行列所表示的二分图结点全部连接。我们这里可以使用并查集去合并集合,连接行列之间的关系。 code: #include <bits/stdc++.h> using

[bzoj4025] 二分图

淺唱寂寞╮ 提交于 2019-11-27 18:20:59
Description 神犇有一个 \(n\) 个节点的图。因为神犇是神犇,所以在T时间内一些边会出现后消失。神犇要求出每一时间段内这个图是否是二分图。这么简单的问题神犇当然会做了,于是他想考考你。 Input 输入数据的第一行是三个整数 \(n\) , \(m\) , \(T\) 。 第2行到第 \(m+1\) 行,每行 4 个整数 \(u\) , \(v\) , \(start\) , \(end\) 。第 \(i+1\) 行的四个整数表示第 \(i\) 条边连接 \(u\) , \(v\) 两个点,这条边在 \(start\) 时刻出现,在第 \(end\) 时刻消失。 Output 输出包含 \(T\) 行。在第i行中,如果第 \(i\) 时间段内这个图是二分图,那么输出 “ \(Yes\) ”,否则输出“ \(No\) ”,不含引号。 Sample Input 3 3 3 1 2 0 2 2 3 0 3 1 3 1 2 Sample Output Yes No Yes HINT 样例说明: 0时刻,出现两条边1-2和2-3。 第1时间段内,这个图是二分图,输出 \(Yes\) 。 1时刻,出现一条边1-3。 第2时间段内,这个图不是二分图,输出 \(No\) 。 2时刻,1-2和1-3两条边消失。 第3时间段内,只有一条边2-3,这个图是二分图,输出 \(Yes\) 。

HGOI 20190816 省常中互测 8

孤者浪人 提交于 2019-11-27 13:08:23
Problem B graph 给出$n$个点$m$条边的连通二分图$G$ ,给出$Q$组询问,每次求出$u,v$路径上(不一定是简单路径)的权值最大值。 一条路径的权值定义为,这条边经过所有节点的异或和,同一个点经过多次将会被计算多次。 对于$100\%$的数据满足$1 \leq n,m,Q\leq t\times 10^5$ Solution : 二分图性质题。   对于一个图$G$是二分图,满足一定是两个集合的点来考虑。   我们考虑$u - v$的一条路径,如果走简单路径就是$u \ xor \ v$的权值,如果走一个来回,那么就是$0$的权值。   所以,对于任意两点的任意一条路径,我们都可以考虑两个相邻点权值是否被异或到路径的答案中,可以同时取反。   对于询问中处在相同集合的两个点,路径经过点的数目一定是奇数,选择若干个点对翻转一定会造成奇数个节点的权值被选择(一个极端的例子就是什么节点都不翻转状态)   由于二分图的连通性,问题就等价于求在所给点集里找出奇数个点,使他们的异或和最大。   在询问中处在相异集合里的两个点,路径经过点的数目一定是偶数,选择若干个点对翻转一定会造成偶数个节点的权值被选择(一个极端的例子就是什么节点都不翻转状态)   由于二分图的连通性,问题就等价于求在所给点集里找出偶数个点,使他们的异或和最大。   在所给点集里找出偶数个点

判断二分图的python实现

孤人 提交于 2019-11-27 02:34:20
给定一个无向图 graph ,当这个图为二分图时返回 true graph将会以邻接表方式给出,graph[i]表示图中与节点i相连的所有节点。每个节点都是一个在0到graph.length-1之间的整数。这图中没有自环和平行边: graph[i] 中不存在i,并且graph[i]中没有重复的值。 def isBipartite(graph) -> bool: n = len(graph) record = [0] * n def dfs(point, c): record[point] = c for i in graph[point]: # 访问为-c的点直接跳过 if record[i] == -c: continue # 染色相同则不能为二分图 elif record[i] == c: return False # 对于没访问过的点染色 elif record[i] == 0 and not dfs(i, -c): return False return True for i in range(n): # 图不是连通的 if record[i] == 0 and not dfs(i, 1): return False return True 示例 1: 输入: [[1,3], [0,2], [1,3], [0,2]] 输出: true 解释: 无向图如下: 0----1 |

KM算法

夙愿已清 提交于 2019-11-27 00:49:14
POJ 2195(KM算法) 转自大牛,牛人天天有,就是没有我啊 这是一个典型的最大匹配的题目,题目意思是给出一些房子和一些人,每个人到每个房子都有一个相应的代价,最后要求怎么安排这些人,房子和人一一配对,使最后的代价最小。 方法是KM算法,是一个求最大(最小)匹配的一个很强大的算法。不过这种题目还可以用费用流来做。 下面是某牛的对KM算法讲解 http://hi.baidu.com/anonympine/blog/item/3ee64954fe6f6256574e0021.html KM算法是通过给每个顶点一个标号(叫做 顶标 )来把求最大权匹配的问题转化为求完备匹配的问题的。设顶点X i 的顶标为A[i],顶点Y i 的顶标为B[i],顶点X i 与Y j 之间的边权为w[i,j]。在算法执行过程中的任一时刻,对于任一条边(i,j),A[i]+B[j]>=w[i,j]始终成立。KM算法的正确性基于以下定理: 若由二分图中所有满足A[i]+B[j]=w[i,j]的边(i,j)构成的子图(称做 相等子图 )有完备匹配,那么这个完备匹配就是二分图的最大权匹配。 这个定理是显然的。因为对于二分图的任意一个匹配,如果它包含于相等子图,那么它的边权和等于所有顶点的顶标和;如果它有的边不包含于相等子图,那么它的边权和小于所有顶点的顶标和。所以相等子图的完备匹配一定是二分图的最大权匹配。

8月清北学堂培训 Day6

旧时模样 提交于 2019-11-27 00:02:21
今天是杨思祺老师的讲授~ 图论 双连通分量 在无向图中,如果无论删去哪条边都不能使得 u 和 v 不联通, 则称 u 和 v 边双连通; 在无向图中,如果无论删去哪个点(非 u 和 v)都不能使得 u 和 v 不联通,则称 u 和 v 点双连通。 u 到 v 的路径没有必经边和必经点 。 割点:删去该点,图分裂为多个连通块。 割边:也叫 “ 桥 ”,删去该边,图分裂为多个连通块。 点双连通分量 类似地,定义 dfn u 和 low u 。 如果 v 是 u 的子结点,并且 low v ≥ dfn u 则点 u 是割点,删去 点 u 后 v 子树和其它点不连通。 每个割点属于多个点双连通分量,非割点只属于一个点双连通分量。 边双连通分量 类似地,定义 dfn u 和 low u 。 如果 v 是 u 的子结点,并且 low v > dfn u 则边 < u, v > 是割边。 每个点属于一个边双连通分量, 边双连通分量之间以割边连接。 洛谷P3469 [POI2008]BLO-Blockade 在Byteotia有 n 个城镇。 一些城镇之间由无向边连接。 在城镇外没有十字路口,尽管可能有桥,隧道或者高架公路(反正不考虑这些)。每两个城镇之间至多只有一条直接连接的道路。人们可以从任意一个城镇直接或间接到达另一个城镇。 每个城镇都有一个公民,他们被孤独所困扰。事实证明

DAY 6 上午

ⅰ亾dé卋堺 提交于 2019-11-26 22:58:55
如果不是割点,答案减少2(n-1) 如果删去割点,删去之后整个图分成多个连通块 每一个联通块的大小*其他连通块的大小之和 先求出缩点之后的树 加尽可能少的边使树变成一个边双 找出树上的所有叶子节点(度为一),然后在这些点之间连边直到所有的点度都为一 增广路的匹配边恰好比非匹配边少1 交换两种边,匹配边+1 最大流=最小割 dinic 每一次找到一条路,使得答案可以增加,更改实际流量 对于已经跑满流量的边先忽略他,从s出发bfs,标记每一个点的深度(到s的距离) 如果s到t联通,说明至少有一条增广路。 每次枚举一条出边,强制使用i+1层的边,找到一条路径,将流量更改 退流 加反向边 记录可扩充容量 首先,肯定有一种方案是每一个边对应一个点 不相交也就是说每个点只有一条入边,一条出边 每一种路径覆盖的方案对应了一种二分图匹配。每选中一个点,就有一个点不需要从自己出发 每选择一条出边,也就是在二分图中选择尽可能多的匹配 要最大化二分图选中的边数,因为这样才能减少答案(一个边两个点) 先算出每一个城镇下面能到达的城镇,建二分图,然后跑最小路径覆盖就完了 >和≥的区别 在跑最短路的时候只能跑≥,一般题目都是求整数解 那么我们只需要把边权+1就行了 建图: x=1 把等号转化成大于等于和小于等于 把严格不等号转移成非严格不等号 每个人的糖果数不小于1 建立一个超级源点

图论之点双&边双

回眸只為那壹抹淺笑 提交于 2019-11-26 22:43:48
说人话: 边双联通: a到b的路径上无必经边 点双联通: a到b的路径上除了a,b没有必经点 tarjan求点双联通: 代码(补图) 割点: 桥: 求点双:强制dfs时不越过割点,即可求出一个块 求边双:dfs时不越过桥 不是割点:减少2n-1 是割点:减少sigmai的大小*其他所有子树的大小 tarjan求桥,然后缩点,会形成一棵树。把树的所有叶子连起来用的边数就是答案 判断: 当且仅当无向图上不含奇环的时候就是二分图 增广路特点:非匹配边比匹配边多一条 寻找增广路:dfs 咕咕咕~ 网络流: 最小割最大流定理:网络流的最大流就是整个图的最小割 dinic:类似匈牙利算法的思路,不断寻找当前最大流能加1的方案 直到不能再加 先dfs一遍,确定每个点到源点s的距离, 同时不断加边,维护当前流量 毒瘤操作:减少某条边的流量 所以就减反向边,边权为0,表示从终点到起点可扩充流量 二分图最大匹配怎么用网络流搞? 在左边建一个超级源点s,在右边建一个超级汇点t s向每个左边的点建一个流量为1的边,右边的点向t建流量为1的边 二分图中间的点不停的寻找能加流量的路,能加就加,知道不能加 总之最大流就是最大匹配 二分图建图小技巧: 如果有x轴,y轴,且有一个坐标(x0,y0) 则就由x0向y0建一条边 国际象棋棋盘:黑白染色(黑的向白的建边) 就是最小覆盖qwq

司机乘客匹配中的距离和最小问题

余生颓废 提交于 2019-11-26 00:45:46
这个是在工作中遇到的一个实际的算法问题,问题描述如下,当前有m个司机,n个乘客,每个司机和每个乘客的距离由经纬度可以计算得到,如何匹配可以使其去接乘客的距离和最小?(只能一个司机接一个乘客) 带权二分图方法 一般对KM算法的描述,基本上可以概括成以下几个步骤: (1) 初始化可行标杆 (2) 用匈牙利算法寻找完备匹配 (3) 若未找到完备匹配则修改可行标杆 (4) 重复(2)(3)直到找到相等子图的完备匹配 关于该算法的流程及实施,网上有很多介绍,基本上都是围绕可行标杆如何修改而进行的讨论,至于原理并没有给出深入的探讨。 KM算法是用于寻找带权二分图最佳匹配的算法。 二分图是这样一种图:所有顶点可以分成两个集:X和Y,其中X和Y中的任意两个在同一个集中的点都不相连,而来自X集的顶点与来自Y集的顶点有连线。当这些连线被赋于一定的权重时,这样的二分图便是带权二分图。 二分图匹配是指求出一组边,其中的顶点分别在两个集合中,且任意两条边都没有相同的顶点,这组边叫做二分图的匹配,而所能得到的最大的边的个数,叫做二分图的最大匹配。 我们也可以换个角度看二分图的最大匹配,即二分图的每条边的默认权重为1,我们求到的二分图的最大匹配的权重最大。对于带权二分图,其边有大于0的权重,找到一组匹配,使其权重最大,即为带权二分图的最佳匹配。 匈牙利算法一般用于寻找二分图的最大匹配