news 2026/7/2 2:25:35

C++ 图论算法:二分图最大匹配

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C++ 图论算法:二分图最大匹配

图论算法:二分图最大匹配 对应蓝桥云课 代码框架见下

#include <iostream> #include <vector> #include <cstring> using namespace std; #define maxn 510 #define maxm 510 vector<int> adj[maxn]; //ad[i][j]代表i号左边的点的第j条边对应的右边的那个顶点 int pre[maxm]; //pre[i]代表和右边顶点i匹配的左边顶点编号 bool visit[maxm]; //visit[i]代表右边的顶点i是否产生了匹配 int n, m; //n代表左边点集数量,m代表右边点集数量 void Hungarian_Init(int n_, int m_) { n = n_ , m = m_ ; memset(pre, -1, sizeof(pre)); for (int i = 1; i <= n; ++i) { adj[i].clear(); } } void Hungarian_AddEdge(int u, int v) { adj[u].push_back(v); } bool Hungarian_findMatch(int u) { for (int i = 0; i < adj[u].size(); ++i) { int v = adj[u][i]; if (!visit[v]) { visit[v] = true; int vpre = pre[v]; pre[v] = u; if (vpre == -1 || Hungarian_findMatch(vpre)) { return true; } pre[v] = vpre; } } return false; } int Hungarian_GetMaxMatch() { int cnt = 0; for (int i = 1; i <= n; ++i) { memset(visit, false, sizeof(visit)); if (Hungarian_findMatch(i)) { cnt++; } } return cnt; } int main() { int n, m, k; cin >> n >> m >> k; Hungarian_Init(n, m); for (int i = 0; i < k; ++i) { int x, y; cin >> x >> y; Hungarian_AddEdge(x, y); } cout << Hungarian_GetMaxMatch() << endl; // 请在此输入您的代码 return 0; }

代码练习1 对应蓝桥云课 职位匹配 代码见下

#include <iostream> #include <vector> #include <cstring> using namespace std; #define maxn 1010 #define maxm 1010 vector<int> adj[maxn]; //ad[i][j]代表i号左边的点的第j条边对应的右边的那个顶点 int pre[maxm]; //pre[i]代表和右边顶点i匹配的左边顶点编号 bool visit[maxm]; //visit[i]代表右边的顶点i是否产生了匹配 int n, m; //n代表左边点集数量,m代表右边点集数量 void Hungarian_Init(int n_, int m_) { n = n_ , m = m_ ; memset(pre, -1, sizeof(pre)); for (int i = 1; i <= n; ++i) { adj[i].clear(); } } void Hungarian_AddEdge(int u, int v) { adj[u].push_back(v); } bool Hungarian_findMatch(int u) { for (int i = 0; i < adj[u].size(); ++i) { int v = adj[u][i]; if (!visit[v]) { visit[v] = true; int vpre = pre[v]; pre[v] = u; if (vpre == -1 || Hungarian_findMatch(vpre)) { return true; } pre[v] = vpre; } } return false; } int Hungarian_GetMaxMatch() { int cnt = 0; for (int i = 1; i <= n; ++i) { memset(visit, false, sizeof(visit)); if (Hungarian_findMatch(i)) { cnt++; } } return cnt; } int main() { int n, m; //n: 职位数量 //m: 求职者数量 cin >> n >> m; Hungarian_Init(m, n); for(int i=1; i <= m; ++i){ int k; cin >> k; while(k--){ int x; cin >> x; Hungarian_AddEdge(i, x); } } cout << Hungarian_GetMaxMatch() << endl; return 0; }

代码练习2 对应蓝桥云课 长方形的覆盖 代码见下

#include <iostream> #include <vector> #include <cstring> using namespace std; #define maxn 510 #define maxm 510 vector<int> adj[maxn]; //ad[i][j]代表i号左边的点的第j条边对应的右边的那个顶点 int pre[maxm]; //pre[i]代表和右边顶点i匹配的左边顶点编号 bool visit[maxm]; //visit[i]代表右边的顶点i是否产生了匹配 int n, m; //n代表左边点集数量,m代表右边点集数量 void Hungarian_Init(int n_, int m_) { n = n_, m = m_; memset(pre, -1, sizeof(pre)); for (int i = 1; i <= n; ++i) { adj[i].clear(); } } void Hungarian_AddEdge(int u, int v) { adj[u].push_back(v); } bool Hungarian_findMatch(int u) { for (int i = 0; i < adj[u].size(); ++i) { int v = adj[u][i]; if (!visit[v]) { visit[v] = true; int vpre = pre[v]; pre[v] = u; if (vpre == -1 || Hungarian_findMatch(vpre)) { return true; } pre[v] = vpre; } } return false; } int Hungarian_GetMaxMatch() { int cnt = 0; for (int i = 1; i <= n; ++i) { memset(visit, false, sizeof(visit)); if (Hungarian_findMatch(i)) { cnt++; } } return cnt; } char c[25][25]; int dir[4][2] = { {0, 1}, {1, 0}, {0, -1}, {-1, 0} }; int main() { int n; cin >> n; for (int i = 0; i < n; ++i) { cin >> c[i]; } Hungarian_Init(n * n, n * n); for (int i = 0; i < n; ++i) { for (int j = 0; j < n; ++j) { if ((i + j) & 1) { for (int k = 0; k < 4; ++k) { int di = i + dir[k][0]; int dj = j + dir[k][1]; if (dj < 0 || di == n || dj < 0 || dj == n) { continue; } if (c[i][j] == '1' || c[di][dj] == '1') { continue; } Hungarian_AddEdge(i * n + j + 1, di * n + dj + 1); } } } } cout << Hungarian_GetMaxMatch() << endl; return 0; }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/1 15:18:12

工业现场抗干扰显示设计:基于framebuffer方案

工业显示为何越来越“返璞归真”&#xff1f;从 Framebuffer 谈抗干扰设计的本质你有没有遇到过这样的场景&#xff1a;一台运行在工厂车间的 HMI 屏&#xff0c;突然黑屏、卡顿&#xff0c;操作按钮毫无响应——而 PLC 和主控程序其实一切正常&#xff1f;事后排查发现&#x…

作者头像 李华
网站建设 2026/7/1 22:55:03

DLSS Swapper性能优化秘籍:3大实战场景深度解析

DLSS Swapper性能优化秘籍&#xff1a;3大实战场景深度解析 【免费下载链接】dlss-swapper 项目地址: https://gitcode.com/GitHub_Trending/dl/dlss-swapper 想要轻松提升游戏性能却不知从何下手&#xff1f;DLSS Swapper作为专业的游戏优化工具&#xff0c;能够帮助你…

作者头像 李华
网站建设 2026/7/1 21:03:02

终极DLSS版本优化指南:如何快速提升游戏画质与性能

终极DLSS版本优化指南&#xff1a;如何快速提升游戏画质与性能 【免费下载链接】dlss-swapper 项目地址: https://gitcode.com/GitHub_Trending/dl/dlss-swapper DLSS Swapper是一款强大的开源工具&#xff0c;专为游戏玩家设计的DLSS版本管理器&#xff0c;让你无需等…

作者头像 李华
网站建设 2026/7/1 8:38:06

网盘直链下载助手终极指南:告别限速,5分钟极速下载体验

网盘直链下载助手终极指南&#xff1a;告别限速&#xff0c;5分钟极速下载体验 【免费下载链接】Online-disk-direct-link-download-assistant 可以获取网盘文件真实下载地址。基于【网盘直链下载助手】修改&#xff08;改自6.1.4版本&#xff09; &#xff0c;自用&#xff0c…

作者头像 李华
网站建设 2026/7/1 20:52:21

DLSS版本管理神器:彻底解决游戏画质与性能冲突的终极方案

DLSS版本管理神器&#xff1a;彻底解决游戏画质与性能冲突的终极方案 【免费下载链接】dlss-swapper 项目地址: https://gitcode.com/GitHub_Trending/dl/dlss-swapper 还在为游戏画质和帧率难以兼得而烦恼吗&#xff1f;当新游戏发布时&#xff0c;你是否经常面临这样…

作者头像 李华
网站建设 2026/7/1 23:00:15

DLSS版本管理器终极指南:让游戏画质全面升级的完整解决方案

DLSS版本管理器终极指南&#xff1a;让游戏画质全面升级的完整解决方案 【免费下载链接】dlss-swapper 项目地址: https://gitcode.com/GitHub_Trending/dl/dlss-swapper DLSS版本管理器是专为游戏玩家设计的强大工具&#xff0c;能够轻松管理和切换不同版本的DLSS文件…

作者头像 李华