核心代码:
bool dfs(int x)
{for(int y=1;y<=V2;y++)
if(city[x][y]&&!vis[y])
{
vis[y]=true;
if(link[y]==0||dfs(link[y]))
{
link[y]=x;
return true;
}
}
return false;
}
void search()
{
for(int x=1;x<=V1;x++)
{
memset(vis,false,sizeof(vis));
if(dfs(x))
m++;
}
return;
}
m是最大匹配数,根据间图的不同,最后结果有变化
求最小点覆盖的时候,结果就是m;
求无向二分图的最小路径覆盖 = 顶点数 – 最大二分匹配数/2,结果就是 n(顶点数) – m/2