原题链接

传送门:Acwing 2326:王者之剑

题目大意

给一个网格图,每个点是宝石的数量,现在从0秒开始可以从任意一个点作为起点开始走,每秒顺序执行下面三件事:1、拿走该点的宝石。2、如果当前是偶数秒,清空上下左右四个相邻的点的宝石。3、向上下左右四个相邻的点走一步或原地不动。问取得宝石数量最多是多少?

思路

看到网格图,可能有人就会敏感的想到网络流了。我们要先分析一下取宝石的过程,会总结出两个性质:①我们只能在偶数秒取宝石。②不可能同时拿走相邻格子上的宝石。这两个性质不难证明,因为偶数秒会清空相邻的宝石,所以奇数秒时走到邻点是没有宝石的,同理,没法取走相邻点的宝石。这样看到性质二,我们就会想到最大权独立集。我们给每个相邻的点之间建一条边,一条边上连的两个点不能同时取,这就是独立集,而每个点的宝石数量就是点权,我们要使点权和最大,这就是最大权独立集。所以不难证明取宝石的每一种合法方案就是一种独立集同时一种独立集就对应了一种取法,所以这就可以转换到最大权独立集来做。
而我们将网格图中所有不相邻的点看成一个集合,剩下的点看成另一个集合,就会将网格图中的所有点分成两个集合,如下图。这样相邻点之间建的边一定是一个集合到另一个集合的边,这就是一个二分图了。于是我们就将原问题转化成了二分图的最大权独立集了。

代码详解

#include<iostream>
#include<queue>
#include<cstring>
using namespace std;
const int N =  10010,M = 100010,INF = 0x3f3f3f3f;int n,m,s,t,cur[N],dis[N],tot;      //tot用来记总权值
int e[M],ne[M],w[M],h[N],idx;
int dx[4] = {-1,0,1,0},dy[4] = {0,1,0,-1};int get(int i,int j)    //计算(i,j)点的序号,以行序为主序对点编号
{return (i-1)*m+j;
}void add(int a,int b,int c)    //建图模板
{e[idx] = b;w[idx] = c;ne[idx] = h[a];h[a] = idx++;e[idx] = a;w[idx] = 0;ne[idx] = h[b];h[b] = idx++;
}bool bfs()         //dinic模板
{queue<int> q;memset(dis,-1,sizeof dis);q.push(s);dis[s] = 0;cur[s] = h[s];while(q.size()){int u = q.front();q.pop();for(int i = h[u];~i;i = ne[i]){int v = e[i];if(dis[v] == -1 && w[i]){dis[v] = dis[u] + 1;cur[v] = h[v];if(v == t)return 1;q.push(v);}}}return 0;
}int dfs(int u,int limit)
{if(u == t)return limit;int flow = 0;for(int i = cur[u];~i;i = ne[i]){int v = e[i];cur[u] = i;if(dis[v] == dis[u]+1 && w[i]){int minf = dfs(v,min(w[i],limit-flow));w[i] -= minf;w[i^1] += minf;flow += minf;if(flow == limit) return flow;}}return flow;
}int dinic()
{int ans = 0;while(bfs())ans += dfs(s,INF);return ans;
}int main()
{cin >> n >> m;s = 0,t = n*m+1;  //设置源汇点memset(h,-1,sizeof h);for(int i = 1;i <= n;i++){for(int j = 1;j <= m;j++){int c;cin >> c;if(i+j & 1)    //将所有点分成两个集合{add(s,get(i,j),c); //s到左边集合的点建一条容量为c的边for(int k = 0;k < 4;k++){int x = i+dx[k],y = j+dy[k];if(x >= 1 && x <= n && y >= 1 && y <= m)  //看该点的上下左右邻点是否存在add(get(i,j),get(x,y),INF); //若存在,从该点向邻点建一条容量为正无穷的边}}else    //另一个集合的点add(get(i,j),t,c); //从该点向t建一条容量为c的边tot += c; //tot计算总权值和}}cout << tot-dinic() << endl;   //最大权独立集 = 总权值 - 最小权点覆盖集return 0;
}

Acwing 2326:王者之剑(网格图之网络流 最大权独立集)相关推荐

  1. [最大点权独立集]AcWing 2326. 王者之剑

    题目:AcWing 2326. 王者之剑 分析: 本题的三个性质: 只能在偶数时间取宝石 相邻格子不能同时取 将棋盘黑白染色组成二分图之后,独立集跟原题的合法方案一一对应 所以本题就是求一个二分图的最 ...

  2. Acwing 2326. 王者之剑

    题目链接 题目思路 由题意可以分析出 1.只能在偶数秒时刻才能拿宝石 2.相邻位置的宝石不可以兼得 3.由2可以想到二分图的最大权独立集 故对于整张图分为两部分 由S连向一部分为坐标之和为奇数的点 另 ...

  3. Leetcode69场双周赛-第四题5931. 用邮票贴满网格图

    5931. 用邮票贴满网格图 题目描述 解题思路 查找标志为0的点,尝试以该点为邮票的左上角,直到尝试为以该点为邮票的右下角.如果能放邮票,并覆盖该为0 的点,则把覆盖的点标志为2.如果不能,直接返回 ...

  4. 【数据结构与算法】之给Nx3网格图涂色的方案数的求解算法

    一.题目要求 你有一个 n x 3 的网格图 grid ,你需要用 红,黄,绿 三种颜色之一给每一个格子上色,且确保相邻格子颜色不同(也就是有相同水平边或者垂直边的格子颜色不同). 给你网格图的行数 ...

  5. [ZJOI2016]旅行者(网格图分治最短路)

    problem luogu-P3350 solution 据说,网格图最短路用分治是一个人人皆知的套路.对不起我不是人 类比整体二分的算法流程. 考虑在一个 (xl,yl)−(yl,yr)(xl,yl ...

  6. MATLAB库函数polly2trellis(卷积码生成多项式转网格图描述)的实现过程详解

    关注公号[逆向通信猿]更精彩!!! 生成多项式转网格图 在MATLAB中,卷积码的维特比(Viterbi)译码实现通常需要先将生成多项式转换成网格图描述,然后才能利用网格图进行维特比译码 生成多项式转 ...

  7. Leetcode 1559二维网格图中探测环 技巧DFS|剪枝

    二维网格图中探测环 给你一个二维字符网格数组 grid ,大小为 m x n ,你需要检查 grid 中是否存在 相同值 形成的环. 一个环是一条开始和结束于同一个格子的长度 大于等于 4 的路径.对 ...

  8. LeetCode 2132. 用邮票贴满网格图(DP/二维差分)

    文章目录 1. 题目 2. 解题 1. 题目 给你一个 m x n 的二进制矩阵 grid ,每个格子要么为 0 (空)要么为 1 (被占据). 给你邮票的尺寸为 stampHeight x stam ...

  9. LeetCode 2087. 网格图中机器人回家的最小代价(脑筋急转弯)

    文章目录 1. 题目 2. 解题 1. 题目 给你一个 m x n 的网格图,其中 (0, 0) 是最左上角的格子,(m - 1, n - 1) 是最右下角的格子. 给你一个整数数组 startPos ...

最新文章

  1. Android 中文API (92) —— MenuInflater
  2. 31 多线程同步之Lock(互斥锁)
  3. 学python要基础吗-自学Python要有其他语言基础吗?
  4. sjms-1 面向对象
  5. [导入]博客搬家了,呵呵
  6. Google的云计算,你真的安全吗?
  7. vc++操作mysql数据库的技巧
  8. (11)Zynq SPI控制器介绍
  9. SQLite使用报告
  10. linux利用内存加快读盘速度,Linux性能优化从入门到实战:10 内存篇:如何利用Buffer和Cache优化程序的运行效率?...
  11. 微信小程序入门(三):miniprogram-ci 实现小程序代码的上传等操作
  12. 传智播客ajax视频教程 百度云,传智播客AJAX视频资料分享
  13. 项目1 :家庭记账系统
  14. WPS中插入“公式”后行距不正常的解决办法
  15. 听过闰年闰月,可你听过闰秒吗?
  16. 2021 写博客指南·万字长文警告
  17. 论文笔记(1):Efficient Convex Completion of Coupled Tensors using Coupled Nuclear Norms
  18. 你好,CSDN,我来了。我想在这里记录我的学习和分享知识教程
  19. 早起—怎样开启高效的一天?
  20. 基于Java/Mysql的个人博客网站

热门文章

  1. 大鹅跌倒,波司登难立?
  2. 前排吃瓜!看鹅厂如何花式辞退7年老员工,这次我要站队了!
  3. 小白到运维工程师自学之路 第三十九集 (LVS架构)
  4. VScode格式化代码快捷键shift+alt+F,格式化代码插件推荐,修改快捷键
  5. Linux 备忘录
  6. [原创]Saltstack学习笔记:命令参数详解以及配置文件说明
  7. [MT2503 System]MT2503 test mode - MTK物联网在线解答 - 技术论坛
  8. 【报告分享】中国K12在线辅导行业总结和趋势洞察2021-易观智库(附下载)
  9. [Python] 3.7中的dataclasses
  10. vbs关不掉的计算机窗口,vbs怎么关闭_vbs整人代码-关不掉的窗口