Hungary算法
匈牙利算法是对于二分图的无权最大匹配的算法,可以在O(n^3)时间内求出二分图的最大匹配数及匹配方案。
具体实现,即从X部一个结点开始DFS,寻找一条交错轨,然后交换各边的匹配状态,此时匹配数+1。当不存在增广路,匹配结束。
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
#define rep(i,x,y) for (int i=x;i<=y;i++)
#define dep(i,y,x) for (int i=y;i>=x;i--)
#define read(x) scanf("%d",&x)
using namespace std;
const int maxn=1000+23;
vector<int> a[maxn];
int nl,nr,m,x,y,match[maxn];
bool vis[maxn];
int DFS(int k)
{
vis[k]=1;
rep(i,0,sz(G[k])-1)
{
int v=G[k][i];
if (!vis[v])
{
int w=match[v];
if ((w==0)||((!vis[w])&&(DFS(w))))
{
match[k]=v,match[v]=k;
return 1;
}
}
}
return 0;
}
void Hungray()
{
ans=0;
memset(match,0,sizeof(match));
rep(i,1,n)
if (match[i]==0)
{
memset(vis,0,sizeof(vis));
ans+=DFS(i);
}
}
int main()
{
scanf("%d%d%d",&nl,&nr,&m);
rep(i,1,m)
{
scanf("%d%d",&x,&y);
a[x].push_back(y+nl);
a[y+nl].push_back(x);
}
printf("%d\n",Hungray());
rep(i,1,nl-1) printf("%d ",match[i]?(match[i]-nl):0);
printf("%d\n",match[nl]?(match[nl]-nl):0);
return 0;
}

浙公网安备 33010602011771号