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