二分图匹配(匈牙利算法)

POJ 1274:http://poj.org/problem?id=1274

匈牙利算法我是看了一个代码后才明白的,原来看算法导论讲的云里雾里,搞不明白,还是代码实现能力太差。

数据结构:

int n, m, ans;                //n个待匹配点去匹配m个点
int  link[Max];              //link[i]=x记录当前与i节点相连的节点x
bool mat[Max][Max];         //  mat[i][j]表示奶牛i能否匹配圈j。
bool vis[Max];             //  标记点是否被访问

DFS搜索为点u寻找匹配点:

bool dfs(int u)       
{        //  表示现在在为u寻求匹配
    for(int i = 1; i <= m; i ++)
        if(!vis[i] && mat[u][i])
        {
            vis[i] = true;
            if(link[i] == -1 || dfs(link[i]))   
            {      //  条件:i还没匹配,或者link[i]找到新的匹配。
                link[i] = u;
                return true;
            }
        }
    return false;
}

初始化:

初始化时要把link[]全部初始化为-1或0。

并在每次对i点匹配时初始化一次vis[]数组,因为对i匹配j时无视j是否已被匹配,只要i和j匹配更好就成了。

 

总体思路:

1.初始化。

link[]全部初始化为-1.mat[i][j]当i可以和j匹配时初始化为1,否则初始化为0.每次匹配i点时初始化vis[]=0。ans=0.

2.对每个点i 搜索dfs,寻找更优的匹配。

i和j可以匹配当且仅当j未被匹配或link[j]找到了新的匹配。

找到后ans++

3.输出ans

posted @ 2012-10-01 14:10  史力普神  阅读(129)  评论(0编辑  收藏  举报