zoukankan      html  css  js  c++  java
  • [题解] PowerOJ 1759 骑士共存问题 (最大流最小割)

    - 传送门 -

     https://www.oj.swust.edu.cn/problem/show/1759

    # 1759: 骑士共存问题

    Time Limit: 2000 MS Memory Limit: 65536 KB
    Total Submit: 195 Accepted: 69 Page View: 870

    Description

    在一个nn个方格的国际象棋棋盘上,马(骑士)可以攻击的棋盘方格如图所示。棋盘上某些方格设置了障碍,骑士不得进入。 对于给定的nn个方格的国际象棋棋盘和障碍标志,计算棋盘上最多可以放置多少个骑 士,使得它们彼此互不攻击。

    Input

    由文件input.txt给出输入数据。第一行有2 个正整数n 和m ( 1 <= n <= 200, 0 <= m < n^2 ), 分别表示棋盘的大小和障碍数。接下来的m 行给出障碍的位置。每行2 个正整数,表示障 碍的方格坐标。

    Output

    将计算出的共存骑士数输出到文件output.txt。

    3 2
    1 1
    3 3

    5

    Source

    线性规划与网络流24题
     

    - 思路 -

     同方格取数问题.
     注意排除障碍点的影响.
     
     细节见代码.
     

    - 代码 -

    #include<cstring>
    #include<cstdio>
    #include<algorithm>
    #include<queue>
    using namespace std;
     
    const int N = 4e4 + 5;
    const int M = 5e5;
    const int inf = 0x3f3f3f3f;
     
    int NXT[M], TO[M], V[M];
    int CUR[N], HD[N], DIS[N], A[N];
    int X[8] = {-2, -2, -1, -1, 1, 1, 2, 2};
    int Y[8] = {-1, 1, -2, 2, -2, 2, -1, 1};
    int n, m, ss, tt, sz, ans;
    queue<int> q;
     
    int mk(int x, int y) { return x * n + y + 1; }
    bool ok(int x) { return x >= 0 && x < n; }
     
    void add(int x, int y, int z) {
        TO[sz] = y; V[sz] = z;
        NXT[sz] = HD[x]; HD[x] = sz++;
        TO[sz] = x; V[sz] = 0;
        NXT[sz] = HD[y]; HD[y] = sz++;
    }
     
    bool bfs() {
        memset(DIS, -1, sizeof (DIS));
        DIS[ss] = 0;
        q.push(ss);
        while (!q.empty()) {
            int u = q.front();
            q.pop();
            for (int i = HD[u]; i != -1; i = NXT[i]) {
                int v = TO[i];
                if (DIS[v] < 0 && V[i]) {
                    DIS[v] = DIS[u] + 1;
                    q.push(v);
                }
            }
        }
        return DIS[tt] > 0;
    }
     
    int dfs(int x, int a) {
        if (x == tt) return a;
        int flow = 0, f;
        for (int& i = CUR[x]; i != -1; i = NXT[i]) {
            if (V[i] && DIS[TO[i]] == DIS[x] + 1)
                if (f = dfs(TO[i], min(a, V[i]))) {
                    flow += f;
                    V[i] -= f;
                    V[i^1] += f;
                    a -= f;
                    if (a == 0) break;
                }
        }
        return flow;
    }
     
    int dinic() {
        int flow = 0;
        while (bfs()) {
            memcpy(CUR, HD, sizeof (HD));
            flow += dfs(ss, inf);
        }
        return flow;
    }
     
    int main() {
        memset(HD, -1, sizeof (HD));
        scanf("%d%d", &n, &m);
        for (int i = 1, x, y; i <= m; ++i) {
            scanf("%d%d", &x, &y);
            A[mk(x - 1, y - 1)] = -1;
        }
        ss = 0, tt = n * n + 1;
        for (int i = 0; i < n; ++i)
            for (int j = 0; j < n; ++j) {
                if (A[mk(i, j)] == -1) continue;
                if (i % 2 == j % 2) {
                    add(ss, mk(i, j), 1);
                    for (int k = 0; k < 8; ++k) {    
                        if (ok(i + X[k]) && ok(j + Y[k]) )
                            if (A[mk(i + X[k], j + Y[k])] != -1)
                                add(mk(i, j), mk(i + X[k], j + Y[k]), inf);
                    }
                }
                else add(mk(i, j), tt, 1);
            }
        printf("%d", n * n - m - dinic());
        return 0;
    }
    
  • 相关阅读:
    pytorch_wavelets包实现的小波变换和MWCNN中的小波变换的异同点
    servlet的xx方式传值中文乱码
    类中添加log4j日志
    QueryRunner实战(query_update)、BeanListBeanHandler、MapListMapHandler、ScalarHandler
    java中常用jar包
    QueryRunner类实战
    Json解析包FastJson使用
    BaseDAO使用
    策略模式
    关于动态代理
  • 原文地址:https://www.cnblogs.com/Anding-16/p/7421752.html
Copyright © 2011-2022 走看看