zoukankan      html  css  js  c++  java
  • 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-sum);
        }
        return 0;
    }
  • 相关阅读:
    celery的使用
    DOM操作
    js动画
    列表案例
    背景案例
    背景属性连写
    背景属性
    链接导航案例
    链接伪类
    优先权之权重会叠加
  • 原文地址:https://www.cnblogs.com/kkrisen/p/3768780.html
Copyright © 2011-2022 走看看