二分圖的最大匹配的匈牙利演算法

life4711發表於2014-10-06

以前做二分圖的題目都是用網路流的解法,昨天碰到了一道匹配要求先後順序的題目,學長說匈牙利演算法可以做到,於是學了一下,現在大概瞭解各所以然了。

參考資料:

https://www.byvoid.com/blog/hungary/

http://www.matrix67.com/blog/archives/39

/* **************************************************************************
//二分圖匹配(匈牙利演算法的DFS實現)
//初始化:g[][]兩邊頂點的劃分情況
//建立g[i][j]表示i->j的有向邊就可以了,是左邊向右邊的匹配
//g沒有邊相連則初始化為0
//uN是匹配左邊的頂點數,vN是匹配右邊的頂點數
//呼叫:res=hungary();輸出最大匹配數
//優點:適用於稠密圖,DFS找增廣路,實現簡潔易於理解
//時間複雜度:O(VE)
//***************************************************************************/
//頂點編號從0開始的
const int MAXN=220;
int uN,vN;//u,v數目
int g[MAXN][MAXN];
int linker[MAXN];
bool used[MAXN];
bool dfs(int u)//從左邊開始找增廣路徑
{
    int v;
    for(v=0;v<vN;v++)//這個頂點編號從0開始,若要從1開始需要修改
      if(g[u][v]&&!used[v])
      {
          used[v]=true;
          if(linker[v]==-1||dfs(linker[v]))
          {//找增廣路,反向
              linker[v]=u;
              return true;
          }
      }
    return false;//這個不要忘了,經常忘記這句
}
int hungary()
{
    int res=0;
    int u;
    memset(linker,-1,sizeof(linker));
    for(u=0;u<uN;u++)
    {
        memset(used,0,sizeof(used));
        if(dfs(u)) res++;
    }
    return res;
}
//******************************************************************************/


相關文章