求无向图中能覆盖每个点的最小覆盖数 单独的点也算一条路径
这个还是可以扯到最大匹配数来,原因跟上面的最大独立集一样,如果某个二分图(注意不是DAG上的)的边是最大匹配边,那说明只要取两个端点只要一条边即可。
故最小覆盖数还是 顶点数-最大匹配数
根据DAG建图的时候,就是DAG有边就给对应的端点建边
#include <iostream> #include <cstdio> #include <cstring> using namespace std; int d[150][150],cnt[150]; int n,m; int vis[150],lefts[150]; bool dfs(int u) { for (int i=0;i<cnt[u];i++){ int v=d[u][i]; if (!vis[v]){ vis[v]=1; if (lefts[v]==-1 || 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,0,sizeof d); memset(cnt,0,sizeof cnt); for (int i=0;i<m;i++){ int a,b; scanf("%d%d",&a,&b); d[a][cnt[a]++]=b; //d[b][cnt[b]++]=a; } int sum=0; memset(lefts,-1,sizeof lefts); for (int i=1;i<=n;i++){ memset(vis,0,sizeof vis); if (dfs(i)) sum++; } printf("%d\n",n-sum); } return 0; }
POJ 1422 DAG最小路径覆盖,布布扣,bubuko.com
原文:http://www.cnblogs.com/kkrisen/p/3768780.html