ps:建图是核心,匹配都是一样的ps:建图是核心,匹配都是一样的ps:建图是核心,匹配都是一样的


//hopcroft_karp算法,复杂度O(sqrt(n)*m)
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
#include <queue>
using namespace std;
const int N = 320;
const int INF = 0x3f3f3f3f;
struct edge
{int to, next;
}e[N*N];
int match[N], head[N];
bool used[N];
int p, n;
int nx, ny, cnt, dis; //nx,ny分别是左点集和右点集的点数
int dx[N], dy[N], cx[N], cy[N]; //dx,dy分别维护左点集和右点集的标号
//cx表示左点集中的点匹配的右点集中的点,cy正好相反
void add(int u,int v)
{e[cnt].to = v;e[cnt].next = head[u];head[u] = cnt++;
}
bool bfs() //寻找增广路径集,每次只寻找当前最短的增广路
{queue<int> que;dis = INF;memset(dx, -1, sizeof dx);memset(dy, -1, sizeof dy);for(int i = 1; i <= nx; i++)//将未遍历的节点入队,并初始化次节点距离为0if(cx[i] == -1) {que.push(i);dx[i] = 0;}while(!que.empty()){int u = que.front();que.pop();if(dx[u] > dis) break;for(int i = head[u]; i != -1; i = e[i].next){int v = e[i].to;if(dy[v] == -1){dy[v] = dx[u] + 1;if(cy[v] == -1) dis = dy[v]; //找到了一条增广路,dis为增广路终点的标号else dx[cy[v]] = dy[v] + 1,que.push(cy[v]);}}}return dis != INF;
}
int dfs(int u)
{for(int i = head[u]; i != -1; i = e[i].next){int v = e[i].to;if(! used[v] && dy[v] == dx[u] + 1) //如果该点没有被遍历过并且距离为上一节点+1{used[v] = true;if(cy[v] != -1 && dy[v] == dis) continue; //u已被匹配且已到所有存在的增广路终点的标号,再递归寻找也必无增广路,直接跳过if(cy[v] == -1 || dfs(cy[v]) ){cy[v] = u,cx[u] = v;return 1;}}}return 0;
}
int hopcroft_karp()
{int res = 0;memset(cx, -1, sizeof cx);memset(cy, -1, sizeof cy);while(bfs()){memset(used, 0, sizeof used);for(int i = 1; i <= nx; i++)if(cx[i] == -1)res += dfs(i);}return res;
}
int main()
{int t, a, b;scanf("%d", &t);while(t--){cnt = 0;memset(head, -1, sizeof head);scanf("%d%d", &p, &n);for(int i = 1; i <= p; i++){scanf("%d", &a);for(int j = 0; j < a; j++){scanf("%d", &b);add(i, b);}}nx = p, ny = n;if(hopcroft_karp() == p) printf("YES\n");else printf("NO\n");}return 0;
}

HK二分图最大匹配算法模板相关推荐

  1. 【模板】匈牙利算法 二分图最大匹配题模板

    [任务] 给定一个二分图,用匈牙利算法求这个二分图的最大匹配数. [说明] 求最大匹配,那么我们希望每一个在左边的点都尽量找到右边的一个点和它匹配. 我们一次枚举左边的点x的所有出边指向的点y, 若y ...

  2. 求解分配问题(二) 二分图最大匹配算法

    我的前一篇文章介绍了对于分配问题的Kuhn-Munkre算法,该算法其实可以看作是邻接矩阵形式的匈牙利算法,如果更抽象地看这个算法,它可以看成是一个二分图匹配算法的变体算法,具体的说,是二分图最大权重 ...

  3. 二分图-匈牙利算法模板

    二分图就不赘述了,我在知识资料整理有相关资料. .最大匹配  .最小路径覆盖  .最小点覆盖  .最大独立集 最大匹配:二分图中边集最大的那个匹配 最小路径(边)覆盖:用尽量小的不想交简单路径覆盖有向 ...

  4. HDU 2255 二分图最佳匹配 模板题

    题目大意: 给定每一个人能支付的房子价值,每个人最多且必须拥有一套房子,问最后分配房子可得到的最大收益 抄了个别人的KM模板,就这样了... 1 #include <cstdio> 2 # ...

  5. NYOJ 题目239 月老的难题 (二分图最大匹配-匈牙利算法模板)

    月老的难题 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 月老准备给n个女孩与n个男孩牵红线,成就一对对美好的姻缘. 现在,由于一些原因,部分男孩与女孩可能结成幸福的一 ...

  6. 【洛谷P3386】【模板】二分图匹配【网络流】

    题目大意: 题目链接:https://www.luogu.org/problemnew/show/P3386 求一个二分图的最大匹配. 思路: 二分图匹配的模板.可以用匈牙利做. 听说这道题卡Dini ...

  7. hdu2063 二分图(基础题)

    这个题目适合刚刚接触二分图的同学做哦: 给一个题目链接 点击打开链接. 题目大意,有K个男女匹配方式, 输入数据的第一行是三个整数K , M , N,分别表示可能的组合数目,女生的人数,男生的人数.0 ...

  8. 2020CCPC(长春) - Combination Lock(二分图博弈)

    题目大意:给出一个密码锁,两个人一起玩游戏,给出初始的密码,规定: 每一次都可以转动一个位置的数字一个单位 不可以转动到已经出现过的数字 不可以转动到被 ban 掉的数字 无法转动的人视为失败,问谁能 ...

  9. HDU 2389 Rain on your Parade(二分匹配+Hopcroft-Carp算法模板题)

    You're giving a party in the garden of your villa by the sea. The party is a huge success, and every ...

最新文章

  1. 用Leangoo敏捷开发工具如何管理用户故事?
  2. jira4.4.5下载与汉化
  3. 踏踏实实做事,老老实实做人
  4. mysql-5.5密码是多少_关于mysql-5.5数据库密码的设置和重置
  5. eclipse手动添加SVN插件
  6. linux开启ping服务,Linux 云服务器禁止和开启Ping
  7. python接口测试jason_Python 接口测试之Json数据文件操作
  8. 多线程设置操作时间间隔_听说,有位Java程序员学完这59道多线程面试题之后,直接面上阿里...
  9. 如何调换antd中Modal对话框确认按钮和取消按钮两个按钮的位置
  10. SAP License:这种ERP系统核查工作实际是在做无用功
  11. 吴恩达二月升级当爸,Jeff Dean打趣:无监督学习要开始了,需要数据集么?
  12. Java菜鸟基础(一)
  13. 基于ESP32制作流光溢彩氛围灯
  14. winpe装linux系统下载,winpe 安装linux
  15. 《头脑王者》--在线排位答题系统构思
  16. java选中一行快捷键_java常用快捷键
  17. Linux入门学习(十 三)—— 怎么给指定用户发送信息? 怎么发送广播消息?
  18. java big5_BIG5编码表
  19. 香浓熵(Shannon)与冯诺伊曼熵(Von Neumann)
  20. 量化研究数据来源汇总

热门文章

  1. 转,大佬关于虚拟内存与物理内存关系讲解。
  2. 网络工程师_记录的一些真题_2008下半年上午
  3. 解读基于多传感器融合的卡尔曼滤波算法
  4. 基于OpenCV的焊件缺陷检测
  5. 【OpenCV 4开发详解】直方图操作
  6. 一,初次接触html+css需要注意的小问题
  7. scroll-苹果滑动卡顿
  8. 网络安全系列之七 网站提权
  9. 利用Bash给Linux服务器增添色彩
  10. 进阶高端,2017年vivo手机用实力说话