思想:和二分图的匈牙利算法思想一样点击打开链接
代码:(邻接表实现)
int V;//顶点数
vector<int> G[max_v];//图的邻接表表示
int match[max_v];//所匹配的顶点
bool used[max_v];//DFS中用到的访问标记
//向图中增加一条连接u和v的边
void add_edge(int u,int v)
{
G[u].push_back[v];
G[v].push_back[u];
}
//通过DFS寻找增广路
bool dfs(int v)
{
used[v]=true;
for(int i=0;i<G[v].size();i++)
{
int u=G[v][i],w=match[u];
if(w<0||!used[w]&&dfs(w))
{
match[v]=u;
match[u]=v;
return true;
}
}
return false;
}
//求解二分图的最大匹配
int bipartite_matching()
{
int res=0;
memset(match,-1,sizeof(match));
for(int v=0;v<V;v++)
{
if(match[v]<0)
{
memset(used,0,sizeof(used));
if(dfs(v))
{
res++;
}
}
}
return res;
}