ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

P2774 方格取数问题(最小割)

2021-04-14 16:04:20  阅读:169  来源: 互联网

标签:连边 int 源点 取数 方格 && 权值 P2774


传送门

题目描述:

有一个 m 行 n 列的方格图,每个方格中都有一个正整数。现要从方格中取数,使任意两个数所在方格没有公共边,且取出的数的总和最大,请求出最大的和。

思路:把棋盘通过纵横坐标和(i+j)的奇偶性拆成黑色和白色的点,然后选择黑色/白色的点与源点连边,权值为点权,白色/黑色的点与汇点连边,权值为点权,然后再把与

源点连边的点(假设为黑)对其周围的点(白点)连边,权值取inf,然后用所有点的权值和sum-最小割就是最大选择。

AC代码:

int n, m;
int dx[4] = { -1,1,0,0 };
int dy[4] = { 0,0,-1,1 };
bool check(int x, int y) {
    return x >= 1 && x <= m && y >= 1 && y <= n;
}
int main() {
    //freopen("test.txt", "r", stdin);
    scanf("%d%d", &m, &n);
    ll sum = 0;
    s = (m + 1) * n + 1, t = s + 1;
    for (int i = 1; i <= m; i++) {
        for (int j = 1; j <= n; j++) {
            int f; scanf("%d", &f);
            sum += f;
            if ((i + j) & 1) {
                add(s, i * n + j, f);
                for (int d = 0; d < 4; d++) {//与源点连边的点和其周围的点连边
                    int x = i + dx[d];
                    int y = j + dy[d];
                    if (check(x, y)) {
                        add(i * n + j, x * n + y, inf);
                    }
                }
            }
            else {
                add(i * n + j, t, f);
            }
        }
    }
    ll mincut = dinic();
    printf("%lld\n", sum - mincut);
    return 0;
}

 

标签:连边,int,源点,取数,方格,&&,权值,P2774
来源: https://www.cnblogs.com/MYMYACMer/p/14658249.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有