zoukankan      html  css  js  c++  java
  • poj3041(最小顶点覆盖)

    链接:点击打开链接

    题意:N*N的矩阵中有一些点代表陨石。每次仅仅能消灭一行或一列连,问须要多少次才干所有消灭

    代码:

    #include <map>
    #include <queue>
    #include <stack>
    #include <vector>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <iostream>
    #include <algorithm>
    using namespace std;
    int n,m;
    int s[505][505];
    int fa[505],vis[505];
    int dfs(int S){
        int i;
        for(i=1;i<=n;i++){
            if(vis[i]==0&&s[S][i]){
                vis[i]=1;
                if(fa[i]==-1||dfs(fa[i])){
                    fa[i]=S;
                    return 1;
                }
            }
        }
        return 0;
    }
    int main(){
        int i,j,u,v,ans;
        while(scanf("%d%d",&n,&m)!=EOF){
            memset(s,0,sizeof(s));
            for(i=1;i<=m;i++){                      //把行和列都变成二分图左右的点
                scanf("%d%d",&u,&v);                //将有陨石的行和列相连。那么问题
                s[u][v]=1;                          //就变为最少选哪几个点使得全部的
            }                                       //边可以都被覆盖。则就是最小覆盖
            ans=0;                                  //最小覆盖=最大匹配,直接匈牙利
            memset(fa,-1,sizeof(fa));
            for(i=1;i<=n;i++){
                memset(vis,0,sizeof(vis));
                if(dfs(i))
                ans++;
            }
            printf("%d
    ",ans);
        }
        return 0;
    }
    

  • 相关阅读:
    阅读笔记十四
    惨淡的蓝桥杯国赛经历
    阅读笔记十三
    阅读笔记十二
    阅读笔记十一
    阅读笔记十
    阅读笔记九
    阅读笔记八
    阅读笔记七
    阅读笔记六
  • 原文地址:https://www.cnblogs.com/yutingliuyl/p/7387603.html
Copyright © 2011-2022 走看看