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;
}

posted @ 2016-03-25 20:33  Krew  阅读(281)  评论(0)    收藏  举报