匈牙利算法
匈牙利算法主要应用于找二分图最大匹配,通过找增广路实现
以下为伪代码
void dfs(int now)
{
for (遍历当前点可以连的边)
{
int to=当前能到达的点
if(没访问过to)
to打访问标记;
if (to没有匹配||to现在的匹配能找到其他节点匹配)
匹配to,now
return true;
}
找不到,return false;
}
下面上code
int mx[maxn],my[maxn][2];
bool vis[maxn];
bool dfs(int now)
{
for (int i=head[now];i;i=e[i].next)
{
int to=e[i].u;
if (!vis[to])
{
vis[to]=true;
for (int j=0;j<=1;j++)
if (!my[to][j]||dfs(my[to][j]))
{
mx[now]=to;
my[to][j]=now;
return true;
}
}
}
return false;
}
int hungarian(int x)
{
int ans=0;
for (int i=1;i<=x;i++)
if (!mx[i])
memset(vis,0,sizeof(vis)),ans+=dfs(i);
return ans;
}
(好简洁啊,完结撒花)