博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
匈牙利算法
阅读量:5818 次
发布时间:2019-06-18

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

 本文转自大牛博客:

 

这是一种用增广路求二分图最大匹配的算法。它由匈牙利数学家Edmonds于1965年提出,因而得名。 定义 未盖点:设Vi是图G的一个顶点,假设Vi 不与随意一条属于匹配M的边相关联,就称Vi 是一个未盖点。

 

交错路:设P是图G的一条路,假设P的随意两条相邻的边一定是一条属于M而还有一条不属于M,就称P是一条交错路。

可增广路:两个端点都是未盖点的交错路叫做可增广路。

 

 

流程图

l

 

伪代码:

bool 寻找从k出发的相应项出的可增广路 { while (从邻接表中列举k能关联到顶点j) { if (j不在增广路上) { 把j增加增广路; if (j是未盖点 或者 从j的相应项出发有可增广路) { 改动j的相应项为k; 则从k的相应项出有可增广路,返回true; } } } 则从k的相应项出没有可增广路,返回false; } void 匈牙利hungary() { for i->1 to n { if (则从i的相应项出有可增广路) 匹配数++; } 输出 匹配数; }

 

演示:

1

 

C实现(作者)

#include <stdio.h> #include <string.h> #define MAX 102 long n,n1,match; long adjl[MAX][MAX]; long mat[MAX]; bool used[MAX]; FILE *fi,*fo; void readfile() { fi=fopen("flyer.in","r"); fo=fopen("flyer.out","w"); fscanf(fi,"%ld%ld",&n,&n1); long a,b; while (fscanf(fi,"%ld%ld",&a,&b)!=EOF) adjl[a][ ++adjl[a][0] ]=b; match=0; } bool crosspath(long k) { for (long i=1;i<=adjl[k][0];i++) { long j=adjl[k][i]; if (!used[j]) { used[j]=true; if (mat[j]==0 || crosspath(mat[j])) { mat[j]=k; return true; } } } return false; } void hungary() { for (long i=1;i<=n1;i++) { if (crosspath(i)) match++; memset(used,0,sizeof(used)); } } void print() { fprintf(fo,"%ld",match); fclose(fi); fclose(fo); } int main() { readfile(); hungary(); print(); return 0; }

Pascal实现(作者)

var a:array[1..1000,1..1000] of boolean; b:array[1..1000] of longint; c:array[1..1000] of boolean; n,k,i,x,y,ans,m:longint; function path(x:longint):boolean; var i:longint; begin for i:=1 to n do if a[x,i] and not c[i] then begin c[i]:=true; if (b[i]=0) or path(b[i]) then begin b[i]:=x; exit(true); end; end; exit(false); end; procedure hungary; var i:longint; begin fillchar(b,sizeof(b),0); for i:=1 to m do begin fillchar(c,sizeof(c),0); if path(i) then inc(ans); end; end; begin fillchar(a,sizeof(a),0); readln(m,n,k); for i:=1 to k do begin readln(x,y); a[x,y]:=true; end; ans:=0; hungary; writeln(ans); end.

 

ps:近期由于比赛,须要用到二分图,图论这东西好多要好好学的。

 

你可能感兴趣的文章
解决Windows 7中文件关联和打开方式
查看>>
oracle系列(五)高级DBA必知的Oracle的备份与恢复(全录收集)
查看>>
Hyper-V 2016 系列教程24 配置 iSCSI存储服务器
查看>>
hp 服务器通过串口重定向功能的使用
查看>>
国外10大IT网站和博客网站
查看>>
C#窗体控件更新(六)
查看>>
对java语言学习的个人看法
查看>>
android第十一期 - SmoothSwitchLibrary仿IOS切换Activity动画效果
查看>>
zabbix 批量web url监控
查看>>
大容量导入和导出数据 -- 格式化文件生成
查看>>
MongoDB CookBook读书笔记之导入导出
查看>>
mysql高可用方案之Keepalived+主主复制
查看>>
Nginx+PHP7 安装及配置
查看>>
KeyPass密码管理软件使用说明
查看>>
shell如何快速锁定所有账号
查看>>
听比喻,懂原理(1)超五类双绞线和六类双绞线的区别
查看>>
HTML 5实现的手机摇一摇
查看>>
Linux 文件IO理解
查看>>
Ninject 2.x细说---2.绑定和作用域
查看>>
30个非常时尚的网页联系表单设计优秀示例
查看>>