学习匈牙利算法ing

先马一发BFS的实现(更优)

queue<int>
Q;


int
prev[__maxNodes];


int
Hungarian()


{


    int
ans
=
0;


    memset(matching,
-1,
sizeof(matching));


    memset(check,
-1,
sizeof(check));


    for
(int
i=0;
i<num_left;
++i)
{


        if
(matching[i]
==
-1)
{


            while
(!Q.empty())
Q.pop();


            Q.push(i);


            prev[i]
=
-1;
// 设 i 为路径起点


            bool
flag
=
false;
// 尚未找到增广路


            while
(!Q.empty()
&&
!flag)
{


                int
u
=
Q.front();


                for
(iterator_t
ix
=
G[u].begin();
ix
!=
G[u].end()
&&
!flag;
++ix)
{


                    int
v
=
edges[*ix].to;


                    if
(check[v]
!=
i)
{


                        check[v]
=
i;


                        Q.push(matching[v]);


                        if
(matching[v]
>=
0)
{
// 此点为匹配点


                            prev[matching[v]]
=
u;


                        }
else
{
// 找到未匹配点,交替路变为增广路


                            flag
=
true;


                            int
d=u,
e=v;


                            while
(d
!=
-1)
{


                                int
t
=
matching[d];


                                matching[d]
=
e;


                                matching[e]
=
d;


                                d
=
prev[d];


                                e
=
t;


                            }


                        }


                    }


                }


                Q.pop();


            }


            if
(matching[i]
!=
-1)
++ans;


        }


    }


    return
ans;


}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值