二分图

AGC004做题小记

我怕爱的太早我们不能终老 提交于 2019-12-02 03:36:52
F补了两天…… 感觉真是太神仙了啊。 D. Teleporter 题意 给定 $ n $ 个点,每个点走一步可以到达 $ a[n] $ ,你要修改最少的边,使得任何点走 $ K $ 步后都位于 $ 1 $ 号节点。一开始所有的点都可以到达 $ 1 $ 。 $ 2 ≤ N ≤ 100000 $ , $ 1 ≤ K ≤ 1e9 $ 题解 naive的贪心。 可以发现 $ a[1] = 1 $ 如果 $ 1 $ 不指向 $ 1 $ , 那么 $ a[1] $ 到 $ 1 $ 距离为 $ K - 1 $ , 不符合题意。 那么问题就变成,给定一颗有根树,根的深度是 $ 0 $ , 改变最少的边,使树的深度不超过 $ K $ 。 $ dp[i] $ 表示 $ i $ 号节点挂下去的链长。 如果 $ dp[i] = K - 1 $ , 且 $ 1 $ 和 $ i $ 没有边,那么就在 $ 1 $ 和 $ i $ 之间拉一条边。 My Submission E. Salvage Robots 题意 给定一个 $ n * m $ 的网格图, 有一个出口, 若干格子上有机器人。你每次可以让所有的机器人全部向上、下、左、右中的一个方向走一格。走到出口的机器人会获救,走出网格的机器人会爆炸。问最多获救的机器人个数。 $ 2 ≤ n , m ≤ 100 $ 。 题解 做过 ARC101F 就会简单不少。

A*G/C011

淺唱寂寞╮ 提交于 2019-12-01 20:24:06
A*G/C011 A Airport Bus 不会zbl/kk B Colorful Creatures 枚举每个开始的点直接倍增 我好像sb了,可行的是一段前缀所以可以直接2分 C Squared Graph 真tm就c都不会啊。。。 考虑图上的两条长度相等的(可以非简单)路径 \(a_1,\ldots,a_k\) 和 \(b_1,\ldots,b_k\) 那么点 \((a_i,b_i)\) 都是连通的。 有两个连通块大小为 \(A,B\) ,要计算它们在新图中会产生多少连通块。 如果有一个是单点那么不会有边所以新图连通块数是 \(AB\) 否则,如果有一个连通块存在鸡环,则产生1个连通块;都是二分图产生2个连通块。 如果想要一条边 \((a,b)-(c,d)\) ,等价于存在一条边 \((a',b),(c',d)\) ,其中 \(x\) 与 \(x'\) 相邻。存在鸡环的话这条边一定可以有,因为你让一个点走到一个鸡环上打转,另一个点在一条边上反复横跳一定可以构造出方案。 是二分图的话,yyb:把二分图黑白染色之后左右分开,显然把两边的点分别放在二元组的前面都会形成一个联通块。 D Half Reflector 真 打表题 打个表找出一次移动的规律是先左移再取反,然后操作 \(2*n\) 次后序列一定是ABABABABABA或BABABABA E Increasing

最小点权覆盖和最大点权独立集

给你一囗甜甜゛ 提交于 2019-12-01 01:45:58
最小点权覆盖和最大点权独立集 •参考资料 [1] 最小点权覆盖与最大点权独立集 •二分图 定义 : 二分图又称作二部图,是图论中的一种特殊模型。 设$G=(V,E)$是一个无向图,如果顶点$V$可分割为两个互不相交的子集$(A,B)$,并且图中的每条边$(i,j)$所关联的两个顶点i和j分别属于这两个不同的顶点集$(i in A,j in B)$,则称图G为一个二分图。 给定一个二分图 $G$,在$G$的一个子图$M$中,$M$的边集中的任意两条边都不依附于同一个顶点,则称$M$是一个匹配。 二分图最小点覆盖和最大独立集都可以转化为最大匹配求解。在这个基础上,把每个点赋予一个非负的权值,这两个问题就转化为:二分图最小点权覆盖和二分图最大点权独立集。 •最小点权覆盖 定义 从$U$或者$V$合中选取一些点,使这些点覆盖所有的边,并且选出来的点的权值尽可能小。 建模 1、先对图二分染色,对于每条边两端点的颜色不同,分成U,V点集 2、然后建立源点S,向其中一种颜色的点连一条容量为该点权值的边 3、建立汇点T,由另一种颜色的点向T连一条容量为该点权值的边 4、对于二分图中原有的边,改为由与S相连的点连向与T相连的点的一条容量为INF的边跑一遍最大流,其结果就是最小点权和。 •最大点权独立集 定义 在二分图中找到权值和最大的点集,使得它们之间两两没有边。(其实它是最小点权覆盖的对偶问题)

洛谷P3386二分图匹配

☆樱花仙子☆ 提交于 2019-11-30 16:57:50
原题链接 二分图的性质 定理:当且仅当无向图G的每一个回路的次数均是偶数时,G才是一个二分图。如果无回路,相当于任一回路的次数为0,故也视为二分图。 二分图的判定 如果一个图是连通的,可以用如下的方法判定是否是二分图: 在图中任选一顶点v,定义其距离标号为0,然后把它的邻接点的距离标号均设为1,接着把所有标号为1的邻接点均标号为2(如果该点未标号的话),如图所示,以此类推。 标号过程可以用一次BFS实现。标号后,所有标号为奇数的点归为X部,标号为偶数的点归为Y部。 接下来,二分图的判定就是依次检查每条边,看两个端点是否是一个在X部,一个在Y部。 如果一个图不连通,则在每个连通块中作判定。 增广路。 如果你仔细读过并画过图,不难发现如果找到一条增广路,那么配对的个数就会加1。 所以说,增广路的本质其实就是一条路径的起点和终点都未配对的点的边。 匈牙利算法: 这个叫匈牙利算法(Hungarian method)的东西是由匈牙利数学家Edmonds于1965年提出,所以叫匈牙利算法。匈牙利算法是二分图匹配最常见的算法,该算法的核心就是寻找增广路径,它是一种用增广路径求二分图最大匹配的算法。 复杂度: 时间复杂度 : 邻接矩阵最坏为O(n3) 邻接表: O(mn) 空间复杂度 : 邻接矩阵:O(n2) 邻接表: O(n+m) 另一个重要概念:二分图 二分图是图论中的一种特殊模型。 设G=

二分图相关问题

你说的曾经没有我的故事 提交于 2019-11-30 12:06:36
update:2019/09/25 重新将两篇二分图的学习报告整合 一,二分图的定义 对于一个图上的所有节点能够分成两个集合且保证边仅存在在两个集合之间,集合内部没有边,这样的图叫做二分图。 二,二分图的一些性质(一些比较重要的性质) 1,二分图没有奇环 2,二分图的最小顶点覆盖 定义:若选择一个点即覆盖了所有与这个点相连的边,最小点覆盖就是选择最少的点覆盖所有的边。 定理:二分图的最小顶点覆盖数=二分图的最大匹配数 3,二分图的最大独立集 定义:选取一些点使得任何两个点之间没有边相连,能选取的最多的顶点称为最大独立集 定理:二分图的最大独立集=二分图的顶点数-二分图的最小顶点覆盖数 三,二分图的判断方法—染色法 算法流程:即对于每条边(u,v)如果v没有染色就染上与u相反的颜色,如果u和v颜色相同,则证明不是二分图, 若能完成所有的染色则证明是一个二分图。 1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 #include<algorithm> 5 6 using namespace std; 7 8 struct node 9 { 10 int ed,nxt; 11 }; 12 node edge[2333]; 13 int n,m,first[2333],cnt; 14 int color[2333];

网络流建模总结

爱⌒轻易说出口 提交于 2019-11-30 01:48:58
最小路径覆盖 将一个点拆分为入点和出点,原图的最小路径覆盖=原图的边数-新图的最大匹配 二分图最小点覆盖 最小点覆盖=最大匹配 二分图最大独立集 最大独立集=点数-最小点覆盖 二分图最小边覆盖 最小边覆盖=点数-最小点覆盖 二分图最小点权覆盖 原二分图中的边(u,v)替换为容量为INF的有向边(u,v),设立源点s和汇点t,将s和x集合中的点相连,容量为该点的权值;将y中的点同t相连,容量为该点的权值。在新图上求最大流,最大流量即为最小点权覆盖的权值和。 二分图最大权独立集 最大权独立集=总权值-最小点覆盖 来源: https://www.cnblogs.com/happyLittleRabbit/p/11544499.html

题解 UVA1194 【Machine Schedule】

依然范特西╮ 提交于 2019-11-29 12:40:12
题目链接 把机器A的n个模式作为n个左部节点,机器B的m个模式作为m个右部节点,每个任务是一条边,连接a[i]和b[i]。由于每个任务需要在A和B之间选一个,所以求这个二分图的最小点覆盖就相当于用最少的模式完成任务。 由König定理,二分图最小点覆盖包含的点数等于二分图最大匹配包含的边数。所以只需求那张图的最大匹配即可。 代码: #include<bits/stdc++.h> using namespace std; typedef long long ll; typedef unsigned long long ull; const int INF=10e8; #define FOR(i,m,n) for (register int i = m; i <= n; i++) #define _FOR(i,m,n) for (register int i = m ; i >= n; i--) #define QAQ printf("QAQ\n"); int n,m,e,Map[1001][1001],match[1001]={0},vis[1001]; bool dfs(int x){ for(int i=1;i<=m;i++){ if(Map[x][i]&&!vis[i]){ vis[i]=1; if(!match[i]||dfs(match[i])){ match[i]=x;

题解 UVA11419 【SAM I AM】

会有一股神秘感。 提交于 2019-11-29 10:21:06
题目链接 Solution SAM I AM 题目大意:给定一个 \(n\) 行 \(m\) 列的网格图,某些网格上有敌人.请你选择一些行和一些列,覆盖所有敌人.并且使得选择的行与列数量之和最小 我们将每行看做 \(X\) 顶点,将每列看做 \(Y\) 顶点.原来行与列的交点就变成 \(X\) , \(Y\) 顶点之间的边.那么原来的网格图就被转化成了一个二分图 所以这道题就是是一道 二分图最小顶点覆盖 的模板题了,只不过输出方案比较恶心而已.关于何为二分图最小顶点覆盖,本文不再赘述 关于二分图最小顶点覆盖,我们有一个定理,即 二分图最小顶点覆盖等于最大匹配 ,下面给出一个简短的证明 设最大匹配为 \(n\) ,那么 \(n\) 个点是必须的 ,因为至少要 \(n\) 个点才能覆盖最大匹配的 \(n\) 条边 \(n\) 个点是足够的 ,除了最大匹配 \(n\) 条边之外的边一定至少有一个顶点在匹配点上(被覆盖) 因为如果它两个顶点都是非匹配点,它就可以作为一条新的匹配边,与最大匹配矛盾 运用这个定理,我们可以很轻松的求出最小需要的炮弹数,但是怎么输出方案呢? 如果 不算与附加源汇相连的附加弧 ,需要计入答案的无非这几种情况: 出度大于 \(1\) 的 \(X\) 顶点 入度大于 \(1\) 的 \(Y\) 顶点 一条边的两个 \(X\) , \(Y\) 顶点 并且它们度数都为 \

二分图判定

痞子三分冷 提交于 2019-11-28 13:39:41
一,二分图的定义 首先,二分图是一个图,这个图的特殊点在于这个图的点可以分成两个集合,并且这个图只在 两个集合间有连边,二分图内部没有连边。 二分图又称作二部图,是图论中的一种特殊模型。 设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B) 并且图中的每条边(i,j)所关联的两个顶点i和j分别属于这两个不同的顶点集(i in A,j in B),则称图G为一个二分图。——百度百科 二,二分图的性质 二分图内部不存在奇环(就是边数为奇数的环),可以作为二分图的判定方法。 三,二分图的判定 一般我们采用染色法,给当前顶点染成一种颜色,给另一个顶点染成不同的颜色,如果某一步时条件冲突 就证明当前不是一个二分图,如果全部染色完成没有冲突就证明是一个二分图。 1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 #include<algorithm> 5 6 using namespace std; 7 8 struct node 9 { 10 int ed,nxt; 11 }; 12 node edge[2333]; 13 int n,m,first[2333],cnt; 14 int color[2333]; 15 bool flag; 16 17 inline void add_edge

[BZOJ4424][CF19E][Contest1338] Fairy

此生再无相见时 提交于 2019-11-28 13:33:49
题面 Description Description 给定n个点,m条边的无向图(无自环),可以从图中删除一条边,问删除哪些边可以使图变成一个二分图。 Input 第1行包含两个整数n,m,分别表示点数和边数。 第2~m+1行每行两个数x,y,表示有一条边连接点x,y。 Output 第一行两个整数,表示能删除的边的个数。 接下来一行按照从小到大的顺序输出能删除的边的编号。 Sample Input 4 4 1 2 1 3 2 4 3 4 Sample Output 4 1 2 3 4 Hint 10%的数据,n,m<=10 40%的数据,n,m<=1000 70%的数据,n,m<=100000 100%的数据,n,m<=2000000 题意 题面挺简单的,不解释。 题解 首先我们知道一个图能成为一个二分图的条件是图中没有奇环,所以我们分类讨论: ①图中没有奇环,即每条边删除后都可以成为二分图。 ②图中只有一个奇环,奇环上的每条边删除后都是二分图。 ③否则符合要求的边一定是所有奇环的公共边且不出现在偶环上(因为当一条边同时出现在奇环和偶环上时,设奇环边数为$X$,偶环边数为$Y$,删除后将会出现一个边数为$X+Y-2$的环,而$X+Y-2$为奇数,即出现了一个新的奇环) 所以我们考虑如何记录每条边是否是所有奇环的公共边。 设一个数组$d$,当dfs染色到$u$并发现$u$连向的$v