zoukankan      html  css  js  c++  java
  • 【POJ 3041】Asteroids (最小点覆盖)

    每次选择清除一行或者一列上的小行星。最少选择几次。

    将行和列抽象成点,第i行为节点i+n,第j列为节点j,每个行星则是一条边,连接了所在的行列。

    于是问题转化成最小点覆盖。二分图的最小点覆盖==最大匹配。

    #include <cstdio>
    #include <cstring>
    const int N=505;
    int n,vis[N],link[N],g[N][N];
    int find(int u){
        for(int i=1; i<=n; i++)//这个1~n是v的范围
            if(g[u][i]&&!vis[i]){
                vis[i]=1;
                if(!link[i]||find(link[i])){
                    link[i]=u;
                    return 1;
                }
            }
        return 0;
    }
    int solve(){
        memset(link,0,sizeof link);
        int ans=0;
        for(int i=1;i<=n;i++){//这个1~n是u的范围
            memset(vis,0,sizeof vis);
            if(find(i))ans++;
        }
        return ans;
    }
    int main(){
        int m,u,v;
        scanf("%d%d",&n,&m);
        memset(g,0,sizeof g);
        while(m--){
            scanf("%d%d",&u,&v);
            g[u][v]=1;
        }
        printf("%d
    ",solve());
    }

      

     

     

  • 相关阅读:
    人脸识别员工考勤系统
    栈和队列
    线性表
    C语言博客作业02--循环结构
    课程设计-个人博客
    C博客作业02--循环结构
    博客作业--函数
    c博客作业
    联系方式
    专业特长
  • 原文地址:https://www.cnblogs.com/flipped/p/5765682.html
Copyright © 2011-2022 走看看