方法一:从x中所有未盖点出发扩展匈牙利树,标记树中所有的点,则X中未标记的点和Y中已标记点组成了所求的最小覆盖。
方法二:求最小割
//先调用MaxMatch后,调用solve
bool match(int u)
{
vst[u] = true;
for(int i=0;i<g[u].size(); i++)
{ int v=g[u][i];
if (T[v]) continue;
T[v] = true;
if (My[v] == -1 || match(My[v]))
{
My[v] = u;
Mx[u] = v;
return true;
}
}
return false;
}
void solve()
{ memset(vst,0,sizeof(vst));
memset(T,0,sizeof(T));
for(int u = 0; u < nx; u++)
if(Mx[u]==-1) match(u);
for(int u = 0; u < nx; u++)if (!vst[u]) printf(" x%d",u+1);
for(int u = 0; u < ny; u++)if (T[u]) printf(" y%d",u+1);
printf("\n");
}