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

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

program hungarian;Type rec=record   e,next:longint; end;Var a:array[0..200] of rec; b,last:array[0..100] of longint;//last表示每个节点在匹配中的对应节点是什么,last[i]=0表示i是未盖点 n,m,i,st,ed,ans,top:longint; v:array[0..100] of boolean;//表示在“每一轮增广”中某个节点有没有访问过Procedure add(st,ed:longint);  begin  inc(top);  with a[top] do    begin    e:=ed;    next:=b[st];  end;  b[st]:=top;end;function dfs(P:longint):boolean;//P下一条总是要找非匹配边var u:longint; y:^rec;  begin  dfs:=false;  u:=b[p];  while u<>b[0] do    begin    y:=@a[u];    u:=y^.next;    if not v[y^.e] then //如果某一个点之前已被访问过表示其已经增广,没有必要再访问      begin      v[y^.e]:=true;      if (last[y^.e]=0) or dfs(last[y^.e]) then //y^.e是未盖点,直接连一条,继续找非匹配边;y^.e是已盖点,先连非匹配边 P - y^.e 再连匹配边 y^.e - last[y^.e] ,之后只要判断dfs(last[y^.e])即可        begin        last[y^.e]:=p;        last[p]:=y^.e;        exit(true);      end;    end;  end;  exit(false);end;  begin  readln(n,m);  fillchar(b,sizeof(b),$ff);top:=-1;  for i:=1 to m do    begin    readln(st,ed);    add(st,ed);    add(ed,st);  end;  ans:=0;  for i:=1 to n do    if last[i]=0 then //从未盖点开始增广,但是没有这一行经测试也行= =暂时不知道为什么      begin      fillchar(v,sizeof(v),false); //每一轮清空v数组      inc(ans,ord(dfs(i)));  //每增广一次ans++    end;  writeln(ans);end.

 附赠一组数据:

Input

6 22

1 7
1 8
1 9
1 11
2 7
2 8
2 12
3 7
3 8
3 9
3 10
3 12
4 7
4 8
4 9
4 12
5 7
5 10
5 12
6 9
6 11
6 12

Output

6

匹配边

1 10

2 8

3 7

4 9

5 12

6 11

转载于:https://www.cnblogs.com/htfy/archive/2013/05/15/3080675.html

你可能感兴趣的文章
安装pandas报错(AttributeError: 'module' object has no attribute 'main')
查看>>
ch02 fundamental definition 01
查看>>
JSON解析
查看>>
Position is everything?(css定位学习的一些心得)(一)
查看>>
如何提高编程水平
查看>>
Jquery Uploadify3.21.与2.1版本 使用中存在的问题--记录三
查看>>
Linux查看进程的内存占用情况 分类: ubuntu ...
查看>>
[BZOJ 2818]Gcd
查看>>
FORM值传递与地址传递
查看>>
(译)yaml快速教程
查看>>
C:大数相加
查看>>
160. Intersection of Two Linked Lists
查看>>
人生苦短,我用python-- Day11
查看>>
JAVA Bean
查看>>
ehcache memcache redis 三大缓存男高音_转
查看>>
curd_3
查看>>
百度地图API示例之设置地图显示范围
查看>>
Java构造方法、重载及垃圾回收
查看>>
.Net Core AES加密解密
查看>>
Spring Quartz实现任务调度
查看>>