zercal
C++博客
首页
新随笔
联系
聚合
管理
10 Posts :: 0 Stories :: 0 Comments :: 0 Trackbacks
常用链接
我的随笔
我的评论
我参与的随笔
留言簿
(1)
给我留言
查看公开留言
查看私人留言
随笔档案
2007年10月 (10)
搜索
最新评论
阅读排行榜
1. PKU1639最小度限制生成树(1059)
2. PKU推荐题目(571)
3. 单元最短路(dijkstra+堆)不是很精简(387)
4. 匈牙利算法求二分图最大匹配(373)
5. 拓扑排序求逆序对(351)
评论排行榜
1. 又开博了(0)
2. 扩展欧几里德(0)
3. 中国剩余定理(菜鸟版,勉强能用)(0)
4. 拓扑排序求逆序对(0)
5. 匈牙利算法求二分图最大匹配(0)
匈牙利算法求二分图最大匹配
#include
<
stdio.h
>
#include
<
cstring
>
//
匈牙利算法
int
xv
=
5
,yv
=
5
,n
=
5
;
//
顶点数(数字5认你定)
int
g[
5
][
5
];
//
g[i][j]=1 表示 xi与yj相邻
int
sy[
5
];
//
辅助:当轮被搜过的y点都是1
int
cnt,xm[
5
],ym[
5
];
//
输出
void
init()
{
cnt
=
0
;
memset(g,
0
,
sizeof
(g));
memset(xm,
-
1
,
sizeof
(xm));
memset(ym,
-
1
,
sizeof
(ym));
}
int
path(
int
u)
//
返回是否找到增广路(递归,时间复杂度O(n*n))
{
int
v;
for
(v
=
0
;v
<
yv;v
++
)
{
if
((g[u][v]
==
1
)
&&
(sy[v]
==
0
))
{
sy[v]
=
1
;
if
((ym[v]
==-
1
)
||
(path(ym[v])
==
1
))
{
xm[u]
=
v;ym[v]
=
u;
return
1
;
}
}
}
return
0
;
}
void
main()
{
int
i,j;
//
初始化
init();
for
(i
=
0
;i
<
n;i
++
)
{
for
(j
=
0
;j
<
n;j
++
)
{
scanf(
"
%d
"
,
&
g[i][j]);
}
}
//
核心
for
(i
=
0
;i
<
xv;i
++
)
{
if
(xm[i]
==-
1
)
{
memset(sy,
0
,
sizeof
(sy));
cnt
+=
path(i);
}
}
//
打印
printf(
"
sum=%d
"
,cnt);
}
posted on 2007-10-06 19:57
zercal
阅读(373)
评论(0)
编辑
收藏
引用
只有注册用户
登录
后才能发表评论。
【推荐】100%开源!大型工业跨平台软件C++源码提供,建模,组态!
网站导航:
博客园
IT新闻
BlogJava
知识库
博问
管理
Powered by:
C++博客
Copyright © zercal