求无向图中能覆盖每个点的最小覆盖数 单独的点也算一条路径

这个还是可以扯到最大匹配数来,原因跟上面的最大独立集一样,如果某个二分图(注意不是DAG上的)的边是最大匹配边,那说明只要取两个端点只要一条边即可。

故最小覆盖数还是 顶点数-最大匹配数

根据DAG建图的时候,就是DAG有边就给对应的端点建边

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int d[][],cnt[];
int n,m;
int vis[],lefts[];
bool dfs(int u)
{
for (int i=;i<cnt[u];i++){
int v=d[u][i];
if (!vis[v]){
vis[v]=;
if (lefts[v]==- || dfs(lefts[v])){
lefts[v]=u;
return true;
}
}
}
return false;
}
int main()
{
int t;
scanf("%d",&t);
while (t--)
{
scanf("%d%d",&n,&m);
memset(d,,sizeof d);
memset(cnt,,sizeof cnt);
for (int i=;i<m;i++){
int a,b;
scanf("%d%d",&a,&b);
d[a][cnt[a]++]=b;
//d[b][cnt[b]++]=a;
}
int sum=;
memset(lefts,-,sizeof lefts);
for (int i=;i<=n;i++){
memset(vis,,sizeof vis);
if (dfs(i)) sum++;
}
printf("%d\n",n-sum);
}
return ;
}
05-11 08:11