首页 > 代码库 > POJ 1422 DAG最小路径覆盖
POJ 1422 DAG最小路径覆盖
求无向图中能覆盖每个点的最小覆盖数 单独的点也算一条路径
这个还是可以扯到最大匹配数来,原因跟上面的最大独立集一样,如果某个二分图(注意不是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; }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。