匈牙利算法只需要以每个节点为起点找一次增广路即可求得最大匹配,寻找增广路的复杂度为O(E),总的复杂度为O(VE)
{附上一段我写的朴素Hungary代码}
5、简要
#include <iostream>
#include <assert.h>
using namespace std;
//二分查找,非递归形式
int binarySearch(int *a, int b, int e, int v)
{
assert(a != NULL);
int *begin = a+b;
int *end = a+e;
int *mid;
//异常处理
if (!a || b >= e)
{
return -1;
}
//折半查找
while (begin < end)
{
mid = begin + ((end - begin) >> 1);
assert(*begin <= *mid && *mid <= *end);
if (*mid > v)
{
end = mid;
}
else if (*mid < v)
{
begin = mid + 1;
}
else
{
return mid - a;
}
}
return -1;
}
//递归实现二分查找
int BinSearch(int Array[],int low,int high,int key/*要找的值*/)
{
assert(Array != NULL);
if (low<=high)
{
int mid = (low+high)>>1;
if(key == Array[mid])
{
return mid;
}
else if(key<Array[mid])
{
return BinSearch(Array,low,mid-1,key);
}
else if(key>Array[mid])
{
return BinSearch(Array,mid+1,high,key);
}
}
else
{
return -1;
}
}
void main()
{
int a[10] = {1,2,3,4,5,6,7,8,9,10};
int b = BinSearch(a,0,9,6);
cout << b <<endl;
}
说明:
简要说明:Dfs函数用于判断从k点开始是否能够找到一条交错路。对于每个可以与k匹配的顶点j,假如它未被匹配,交错路就已经找到;假如j已与某顶点x匹配,那么只需调用Dfs(x)来求证x是否可以与其它顶点匹配,如果返回true的话,仍可以使j与k匹配;这就是一次DFS。每次DFS时,要标记访问到的顶点(state[j]=true),以防死循环和重复计算。