题目链接 题意:求哪些点一定在最大匹配中. 这儿写过,再写一遍吧. 求哪些点不一定在最大匹配中.首先求一遍最大匹配,未匹配点当然不一定在最大匹配中. 设一个未匹配点为A,如果存在边A-B,且存在匹配边B-C,那么可以A替换C,即匹配边变成A-B.最大匹配数不会改变. 所以C,也就是与未匹配点相邻的点的匹配点,不一定在最大匹配中. 这样DFS一遍就行了,这儿的复杂度是\(O(n+m)\). 求最大匹配的时候,匈牙利不是\(O(nm)\)吗,竟然能过么.. 还是写一遍网络流.Dinic是\(O(\s…
链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1854 写法1: 二分图最大匹配 思路:  将武器的属性对武器编号建边,因为只有10000种属性,我们直接对1-10000跑二分图匹配,同时用时间戳优化匹配. 实现代码: #include<bits/stdc++.h> using namespace std; ; vector<int>g[M]; int vis[M],pre[M],t,n; bool dfs(int u){…
题解:给出一个二分图,问你取点哪个点会使得二分图匹配数减少. 解法:其实就是问二分图匹配的必须点.先对初始二分图做一次最大匹配. 现在考虑左边点,看残余网络上的边重新构图:如果是匹配边那么就从右往左连边,如果是非匹配边就从左往右连边.然后从每个非匹配点出发dfs标记每一个访问过的点.最后是匹配点且未被访问过的就是必须点.为什么呢?仔细考虑新构的图,从未匹配点出发的其实也是一条增广路,如果这条增广路能访问到 已匹配点 .那么我们就可以把这条增广路取反得到另一种匹配方案,也就是说这个被访问到的 已匹…
题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3546 题意:给定一个二分图.(AB两个集合的点为n,m),边有K个.问去掉哪些点后最大匹配会减少. 思路:首先建图跑最大流.然后从s开始dfs一次,若能跑到B集合中的点x,那么说明x可以匹配A集合中的某点,那么x删掉也无所谓.从t开始dfs一次,类似,到达s中的y,那么y删掉也无所谓. const int INF=1000000005; const int N=20005; st…
Description 一个舞会有N个男孩(编号为1..N)和M个女孩(编号为1..M),一对男女能够组成一对跳舞当且仅当他们两个人互相认识. 我们把一种人定义成这个舞会的life:当且仅当如果他(她)不参加这个舞会,那么能够同时配对的最大舞伴对数会下降. 现在知道男生和女生之间的认识关系,需要你求出男生和女生中的是这个舞会的life的人的编号. Input 第一行3个整数N,M,K,表示N个男生,M个女生,K对关系. 接下来K行,每行两个整数a_i b_i,表示第a_i个男生和第b_i个女生相…
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1059 分析:不论如何交换,同一行或同一列的点还是同一行或同一列,如果我们称最后可以排成题目要求的主对角线的n个黑色格子为“有用黑色格子",那么如果在初始状态中有2个黑色格子在同一行或同一列那么它们中间必有一个不是”有用黑色格子“(因为不论如何交换他们总是同一行或同一列,必定不能同时成为主对角线上的有用黑色格子).所以我们要找的n个”有用黑色格子"它们的横纵坐标都不同.问题就变成了从…
题目链接: http://www.lydsy.com/JudgeOnline/problem.php?id=4443 题解: 二分答案,判断最大匹配是否>=n-k+1: #include<iostream> #include<cstdio> #include<cstring> #include<vector> using namespace std; ; const int INF=1e9; int mat[maxn][maxn]; int n,m,k…
3993: [SDOI2015]星际战争 题意:略 R1D2T1考了裸二分答案+二分图最大匹配... #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> using namespace std; typedef long long ll; const int N=105, M=1e5+5, INF=1e9+5;…
Dilworth定理:偏序集能划分成的最少的全序集的个数与最大反链的元素个数相等. 证明:http://www.cnblogs.com/itlqs/p/6636222.html 题目让求的是最大反链的长度,因此可以转化为最少能划分成的链的个数.这个问题可以用二分图的最大匹配做. 建立一个二分图,两边都是n个点,原图的每个点 i 对应两个,在左边的叫做 i1, 在右边的叫做 i2 . 然后原图中如果存在一条边 (x, y),那么就在二分图中建立 (x1, y2) 的边. 这样建立二分图之后,原图的…
匈牙利算法是由匈牙利数学家Edmonds于1965年提出,因而得名.匈牙利算法是基于Hall定理中充分性证明的思想,它是二部图匹配最常见的算法,该算法的核心就是寻找增广路径,它是一种用增广路径求二分图最大匹配的算法. #include<stdio.h> #include<string.h> #include<stdlib.h> int n1,n2; ][]; //数组开大点 ][],mapy[][]; ][];//邻接矩阵true代表有边相连 ],visit[]; in…