zoukankan      html  css  js  c++  java
  • POJ1719- Shooting Contest(二分图最大匹配)

    题目链接


    题意:给定一个矩阵,每列有两个白点,其它都是黑点,如今要求每列选一个白点,使得每一行至少包括一个白点被选中

    思路:利用白点所在的位置用行指向列建图,用行去匹配列,最大匹配数假设不等于行数的话,就无解。

    代码:

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <vector>
    #include <algorithm>
    
    using namespace std;
    
    const int MAXN = 1005;
    
    vector<int> g[MAXN];
    int linker[MAXN];
    bool used[MAXN];
    int r, c;
    
    bool dfs(int u) {
        for (int i = 0; i < g[u].size(); i++) {
            int v = g[u][i]; 
            if (!used[v]) {
                used[v] = true; 
                if (linker[v] == -1 || dfs(linker[v])) {
                    linker[v] = u; 
                    return true;
                }
            } 
        }
        return false;
    }
    
    int save[MAXN];
    
    void hungary() {
        int res = 0;
        memset(linker, -1, sizeof(linker));
        for (int u = 1; u <= r; u++) {
            memset(used, false, sizeof(used)); 
            if (dfs(u)) res++;
        }
        if (res != r) {
            printf("NO
    ");  
            return;
        }
        for (int i = 1; i <= c; i++) 
            printf("%d%c", linker[i] != -1 ? linker[i] : save[i], i == c ? '
    ' : ' '); 
    }
    
    int main() {
        int cas;
        scanf("%d", &cas);
        while (cas--) {
            scanf("%d%d", &r, &c); 
            for (int i = 1; i <= r; i++) g[i].clear();
    
            int pos;  
            for (int i = 1; i <= c; i++) {
                for (int j = 0; j < 2; j++) {
                    scanf("%d", &pos); 
                    save[i] = pos;
                    g[pos].push_back(i);
                }
            }
            hungary();
        }
        return 0;
    }


  • 相关阅读:
    hdu 4358 Boring counting 夜
    流式读取文件
    文件夹操作
    通过 fs 模块创建下列文件结构练习
    如何判断一个路径是否为文件夹
    文件读取
    写入流写入文件
    文件简单写入
    移动并重名文件,删除文件
    __dirname绝对路径
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/4271121.html
Copyright © 2011-2022 走看看