博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
二分图最大匹配 Hopcroft-Karp算法模板
阅读量:6696 次
发布时间:2019-06-25

本文共 1836 字,大约阅读时间需要 6 分钟。

#include 
#include
#include
#include
#include
#include
using namespace std;const int MAXN = 3010;//左边节点数量、右边节点数量const int MAXM = 3010*3010;//边的数量const int INF = 0x7FFFFFFF;struct Edge{ int v; int next;}edge[MAXM];int nx, ny;int cnt;int dis;int first[MAXN];int xlink[MAXN], ylink[MAXN];/*xlink[i]表示左集合顶点所匹配的右集合顶点序号,ylink[i]表示右集合i顶点匹配到的左集合顶点序号。*/int dx[MAXN], dy[MAXN];/*dx[i]表示左集合i顶点的距离编号,dy[i]表示右集合i顶点的距离编号*/int vis[MAXN]; //寻找增广路的标记数组void init(){ cnt = 0; memset(first, -1, sizeof(first)); memset(xlink, -1, sizeof(xlink)); memset(ylink, -1, sizeof(ylink));}void read_graph(int u, int v){ edge[cnt].v = v; edge[cnt].next = first[u], first[u] = cnt++;}int bfs(){ queue
q; dis = INF; memset(dx, -1, sizeof(dx)); memset(dy, -1, sizeof(dy)); for(int i = 0; i < nx; i++) { if(xlink[i] == -1) { q.push(i); dx[i] = 0; } } while(!q.empty()) { int u = q.front(); q.pop(); if(dx[u] > dis) break; for(int e = first[u]; e != -1; e = edge[e].next) { int v = edge[e].v; if(dy[v] == -1) { dy[v] = dx[u] + 1; if(ylink[v] == -1) dis = dy[v]; else { dx[ylink[v]] = dy[v]+1; q.push(ylink[v]); } } } } return dis != INF;}int find(int u){ for(int e = first[u]; e != -1; e = edge[e].next) { int v = edge[e].v; if(!vis[v] && dy[v] == dx[u]+1) { vis[v] = 1; if(ylink[v] != -1 && dy[v] == dis) continue; if(ylink[v] == -1 || find(ylink[v])) { xlink[u] = v, ylink[v] = u; return 1; } } } return 0;}int MaxMatch(){ int ans = 0; while(bfs()) { memset(vis, 0, sizeof(vis)); for(int i = 0; i < nx; i++) if(xlink[i] == -1) { ans += find(i); } } return ans;}int main(){ init(); nx=0,ny=0;//左边顶点数量,右边顶点数量 //加边的格式,左边的i和右边的j相连 read_graph(i, j); int ans = MaxMatch(); printf("%d\n\n", ans); return 0;}

 

转载于:https://www.cnblogs.com/zufezzt/p/4791854.html

你可能感兴趣的文章
windows7快速切换ip批处理
查看>>
第二章 LYNC2010产品功能介绍
查看>>
Linux基础--进程管理和作业控制
查看>>
Linux 查看服务器开放的端口号
查看>>
left join on 和where条件的放置
查看>>
关于电脑程序无响应的常见原因以及解决办法
查看>>
MFC_UpdateData()函数的用法
查看>>
MAC安装MySQL-python报错:EnvironmentError: mysql_config not found
查看>>
jvm的native方法
查看>>
PL/SQL使用技巧收集
查看>>
skipped when looking for precompiled header
查看>>
中文乱码解决方案 之 过滤器的应用
查看>>
Nginx 查看运行状态
查看>>
功能性转场动画效果设计
查看>>
Java基础学习笔记 -- 3(变量、标识符、关键字)
查看>>
Java核心API -- 3(正则表达式)
查看>>
Vue.js学习系列(四十五)-- 自定义指令
查看>>
ExpandableList一种可以伸展收缩的listview
查看>>
linux输入输出重定向
查看>>
RIP的五大防环机制
查看>>