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号
浙公网安备 33010602011771号