news 2026/5/11 14:26:49

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/5/10 11:51:26

LCD12864与Modbus协议联动显示:项目实践

让经典显示模块“活”起来&#xff1a;LCD12864 Modbus 实现远程动态显示实战你有没有遇到过这样的场景&#xff1f;一台设备摆在配电柜里&#xff0c;本地装了个 LCD12864 屏幕&#xff0c;显示着“温度&#xff1a;XXC”、“状态&#xff1a;运行中”。一切看起来很完美——…

作者头像 李华
网站建设 2026/5/9 17:54:31

DLSS Swapper终极方案:一键掌控游戏画质与性能平衡

DLSS Swapper终极方案&#xff1a;一键掌控游戏画质与性能平衡 【免费下载链接】dlss-swapper 项目地址: https://gitcode.com/GitHub_Trending/dl/dlss-swapper 还在为游戏更新后DLSS效果变差而烦恼吗&#xff1f;是否遇到过某些游戏版本DLSS表现不佳&#xff0c;却只…

作者头像 李华
网站建设 2026/5/10 7:33:08

高效DLSS管理秘籍:专业玩家的性能优化指南

高效DLSS管理秘籍&#xff1a;专业玩家的性能优化指南 【免费下载链接】dlss-swapper 项目地址: https://gitcode.com/GitHub_Trending/dl/dlss-swapper 想要在不更新游戏的情况下获得最新DLSS技术带来的性能飞跃吗&#xff1f;DLSS Swapper作为一款智能DLL文件管理工具…

作者头像 李华
网站建设 2026/5/10 14:23:04

STM32CubeMX安装后如何配置实时操作系统(RTOS)用于工控

从零开始&#xff1a;用STM32CubeMX配置FreeRTOS打造工业级实时控制系统你有没有遇到过这样的场景&#xff1f;在开发一个工控设备时&#xff0c;主循环里塞满了ADC采样、串口通信、按键扫描和LED刷新的代码&#xff0c;越写越乱&#xff0c;稍有延时不均就导致某个功能“卡死”…

作者头像 李华
网站建设 2026/5/10 16:57:32

DLSS Swapper:游戏性能优化的革命性工具

DLSS Swapper&#xff1a;游戏性能优化的革命性工具 【免费下载链接】dlss-swapper 项目地址: https://gitcode.com/GitHub_Trending/dl/dlss-swapper 在追求极致游戏体验的道路上&#xff0c;DLSS Swapper作为一款专为NVIDIA显卡用户打造的免费工具&#xff0c;正在彻…

作者头像 李华
网站建设 2026/5/10 16:27:06

DLSS版本管理终极指南:如何专业掌控游戏画质与性能

DLSS版本管理终极指南&#xff1a;如何专业掌控游戏画质与性能 【免费下载链接】dlss-swapper 项目地址: https://gitcode.com/GitHub_Trending/dl/dlss-swapper 还在为游戏更新后DLSS效果变差而烦恼吗&#xff1f;作为技术工具性能优化与配置管理的专家&#xff0c;我…

作者头像 李华