zoukankan      html  css  js  c++  java
  • 某程笔试T2,最小点覆盖

    题意:

    N*M 01矩阵,每次可以删去一行或者一列,问删去所有的1最少操作次数

    emmm

    poj3041原题
    二分图,行当成一个点放左边,列当成一个点放右边
    即求最小点覆盖 == 最大匹配

    好久不做题脑子快生锈了

    code

    好多人吐槽这vector的格式

    不知道用自己写的板子算不算作弊

    #include<bits/stdc++.h>
    using namespace std;
    const int N = 1111;
    
    struct Hungary{
        vector <int> G[N];
        bool used[N];
        int girl[N], n, m;
    
        inline void init(int _n, int _m){
            n = _n, m = _m;
            for (int i = 0; i <= n; i++) G[i].clear();
        }
    
        inline void addEdge(const int &u, const int &v){
            G[u].push_back(v);
        }
    
        bool Find(int x){
            for (int i = 0; i < G[x].size(); i++){
                int j = G[x][i];
                if (used[j]) continue;
                used[j] = 1;
                if (girl[j] == -1 || Find(girl[j])) {
                    girl[j] = x;
                    return true;
                }
            }
            return false;
        }
    
        inline int hungary(const int &n, const int &m){
            int all = 0;
            memset(girl, -1, sizeof girl);
            for (int i = 0; i < n; i++) {
                memset(used, 0, sizeof(used)); //这个在每一步中清空
                if (Find(i)) all += 1;
            }
            //for (int i = 0; i < m; i++) printf("girl[%d] = %d
    ", i, girl[i]);
            //printf("all = %d
    ", all);
            return all;
        }
    } hg;
    
    int calculate(int rows, int cols, vector < vector < int > > matrix) {
        hg.init(rows, cols);
        for (int i = 0; i < rows; i++){
            for (int j = 0; j < cols; j++){
                if (matrix[i][j]) hg.addEdge(i, j);
            }
        }
        int match = hg.hungary(rows, cols);
        //printf("%d
    ", match);
        //int ans = rows + cols - match;
        return match;
    }
    /******************************结束写代码******************************/
    
    int main() {
        //freopen("in.txt", "r", stdin);
        int res;
        int _matrix_rows = 0;
        int _matrix_cols = 0;
        cin >> _matrix_rows >> _matrix_cols;
        vector< vector < int > > _matrix(_matrix_rows);
        for(int _matrix_i=0; _matrix_i<_matrix_rows; _matrix_i++) {
            for(int _matrix_j=0; _matrix_j<_matrix_cols; _matrix_j++) {
                int _matrix_tmp;
                cin >> _matrix_tmp;
                _matrix[_matrix_i].push_back(_matrix_tmp);
            }
        }
    
        res = calculate(_matrix_rows, _matrix_cols, _matrix);
        cout << res << endl;
        return 0;
    }
  • 相关阅读:
    c#中枚举的使用
    WEB页面下载内容导出excel
    浏览器使用说明
    ChromiumWebBrowser 禁用右键菜单
    ExpressionHelp2
    安装T4环境
    打印功能
    操作图片
    软件开发中的框架概念和技术路线概念
    Grpc-Client引用Server的proto文件时Build Fail
  • 原文地址:https://www.cnblogs.com/cww97/p/12349321.html
Copyright © 2011-2022 走看看