• AcWing 372. 棋盘覆盖


    算法

    二分图+匹配

    思路

    一个骨牌链接两个格子,格子为节点,骨牌为连接两个格子的边。

    0要素

    将格子黑白染色,同色格子间没有边。

    1要素

    每个格子只能被1个骨牌覆盖,唯一边。

    知识

    匈牙利

    bool dfs(int x) {
        for (unsigned int i = 0; i < e[x].size(); i++) {
            int y = e[x][i];
            if (v[y]) continue;
            v[y] = 1;
            if (f[y] == -1 || dfs(f[y])) {
                f[y] = x;
                return 1;
            }
        }
        return 0;
    }
    

      

    二分图匹配

    有曾广路加一。

    代码

    #include <cstdio>
    #include <vector>
    #include <cstring>
    #include <iostream>
    using namespace std;
    const int N = 106;
    const int dx[4] = {0,0,1,-1};
    const int dy[4] = {1,-1,0,0};
    int n, m, ans, f[N*N];
    bool b[N][N], v[N*N];
    vector<int> e[N*N];
    
    bool dfs(int x) {
        for (unsigned int i = 0; i < e[x].size(); i++) {
            int y = e[x][i];
            if (v[y]) continue;
            v[y] = 1;
            if (f[y] == -1 || dfs(f[y])) {
                f[y] = x;
                return 1;
            }
        }
        return 0;
    }
    
    int main() {
        cin >> n >> m;
        while (m--) {
            int x, y;
            scanf("%d %d", &x, &y);
            b[x-1][y-1] = 1;
        }
        for (int i = 0; i < n; i++)
            for (int j = 0; j < n; j++)
                if (!b[i][j])
                    for (int k = 0; k < 4; k++) {
                        int x = i + dx[k], y = j + dy[k];
                        if (x >= 0 && x < n && y >= 0 && y < n && !b[x][y]) {
                            e[i*n+j].push_back(x * n + y);
                            e[x*n+y].push_back(i * n + j);
                        }
                    }
        memset(f, -1, sizeof(f));
        for (int i = 0; i < n; i++)
            for (int j = 0; j < n; j++) {
                if ((i ^ j) & 1) continue;
                memset(v, 0, sizeof(v));
                ans += dfs(i * n + j);
            }
        cout << ans << endl;
        return 0;
    }
    
    作者:ruanmowen
    链接:https://www.acwing.com/activity/content/code/content/274974/
    来源:AcWing
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
    

      

  • 相关阅读:
    并发编程 Outline of Netty
    SpringCloud(CI/CDNexus+Gitea+Jenkins)
    ubuntu 桌面卡死 解决方法
    xrdp 服务器端及客户端配置
    linux 用户 配置
    windows 配置 多用户 远程桌面
    redis启动报无权限
    lambda表达式常用(常更)
    ABAP字符串控制函数
    [转]销售凭证处理的User Exit
  • 原文地址:https://www.cnblogs.com/ruanmowen/p/12724213.html
Copyright © 2020-2023  润新知