[luoguP2774] 方格取数问题(最大点权独立集)

传送门

 

引入两个概念:

最小点权覆盖集:满足每一条边的两个端点至少选一个的最小权点集。

最大点权独立集:满足每一条边的两个端点最多选一个的最大权点集。

现在对网格染色,使得相邻两点颜色不同,之后把两个颜色的点分成两个集合X,Y。S向X集合每个点连一条该点权值的边,Y集合每个点向T连一条该点权值的边,原来的边流量全部变为INF。这个网络的最小割为最小点权覆盖集。因为这个最小割满足了,对于中间每一条边,两端的点必定选择了一个。若一个都没有选择则S与T仍连通。且因为中间的边流量为INF所以不会是中间被堵塞。

然后我们可以证明对于每一个点权覆盖集,将选的点不选,不选的点选,得到的点集一定是一个点权独立集。因为每一条边至少选了一个,反选后就至少有一个选不了。

所以该网络的最小割=最大流=权值和-答案

答案就是权值和-最大流,跑一遍最大流即可

 

——代码

  1 #include <queue>
  2 #include <cstdio>
  3 #include <cstring>
  4 #include <iostream>
  5 #define INF 1e9
  6 #define N 10010
  7 #define M 50001
  8 #define min(x, y) ((x) < (y) ? (x) : (y))
  9 
 10 int n, m, cnt, sum, s, t, num;
 11 int head[N], to[M], val[M], next[M], dis[N], cur[N];
 12 int map[101][101], dx[4] = {0, 1, -1, 0}, dy[4] = {1, 0, 0, -1};
 13 
 14 inline int read()
 15 {
 16     int x = 0, f = 1;
 17     char ch = getchar();
 18     for(; !isdigit(ch); ch = getchar()) if(ch == '-') f = -1;
 19     for(; isdigit(ch); ch = getchar()) x = (x << 1) + (x << 3) + ch - '0';
 20     return x * f;
 21 }
 22 
 23 inline void add(int x, int y, int z)
 24 {
 25     to[cnt] = y;
 26     val[cnt] = z;
 27     next[cnt] = head[x];
 28     head[x] = cnt++;
 29 }
 30 
 31 inline bool bfs()
 32 {
 33     int i, u, v;
 34     std::queue <int> q;
 35     memset(dis, -1, sizeof(dis));
 36     q.push(s);
 37     dis[s] = 0;
 38     while(!q.empty())
 39     {
 40         u = q.front(), q.pop();
 41         for(i = head[u]; i ^ -1; i = next[i])
 42         {
 43             v = to[i];
 44             if(val[i] && dis[v] == -1)
 45             {
 46                 dis[v] = dis[u] + 1;
 47                 if(v == t) return 1;
 48                 q.push(v);
 49             }
 50         }
 51     }
 52     return 0;
 53 }
 54 
 55 inline int dfs(int u, int maxflow)
 56 {
 57     if(u == t) return maxflow;
 58     int v, d, ret = 0;
 59     for(int &i = cur[u]; i ^ -1; i = next[i])
 60     {
 61         v = to[i];
 62         if(val[i] && dis[v] == dis[u] + 1)
 63         {
 64             d = dfs(v, min(val[i], maxflow - ret));
 65             ret += d;
 66             val[i] -= d;
 67             val[i ^ 1] += d;
 68             if(ret == maxflow) return ret;
 69         }
 70     }
 71     if(ret ^ maxflow) dis[u] = -1;
 72     return ret;
 73 }
 74 
 75 int main()
 76 {
 77     int i, j, k, x, y;
 78     m = read();
 79     n = read();
 80     s = 0, t = n * m + 1;
 81     memset(head, -1, sizeof(head));
 82     for(i = 1; i <= m; i++)
 83         for(j = 1; j <= n; j++)
 84         {
 85             num++;
 86             sum += x = read();
 87             if((i + j) & 1)
 88             {
 89                 add(s, num, x), add(num, s, 0);
 90                 if(i > 1) add(num, num - n, INF), add(num - n, num, 0);
 91                 if(i < m) add(num, num + n, INF), add(num + n, num, 0);
 92                 if(j > 1) add(num, num - 1, INF), add(num - 1, num, 0);
 93                 if(j < n) add(num, num + 1, INF), add(num + 1, num, 0);
 94             }
 95             else add(num, t, x), add(t, num, 0);
 96         }
 97     while(bfs())
 98     {
 99         for(i = s; i <= t; i++) cur[i] = head[i];
100         sum -= dfs(s, INF);
101     }
102     printf("%d\n", sum);
103     return 0;
104 }
View Code

 

转载于:https://www.cnblogs.com/zhenghaotian/p/6936100.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/252576.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

光谱分布、光谱辐射通量密度与不同时间段分布光谱(图示)

1、光谱分布图 2 太阳辐射能量图 3、不同时间段的太阳分布光谱图 4、不同波长的光的能量分布主要区域 5、不同波段的使用场景

基于深度学习和传统算法的人体姿态估计,技术细节都讲清楚了

计算机视觉的一大研究热点是人体姿态估计&#xff0c;还有很多问题急需解决&#xff0c;比如遮挡&#xff0c;交互等等。在最近的CVPR2020里边也有很多这方面的工作。本文站长主要是想谈谈基于深度学习的实时多人姿态估计。 人体姿态估计要干嘛&#xff1f; 关于人类活动规律的…

杨浦区阜盛农民工子弟小学见闻

天气有些阴沉&#xff0c;起了个大早&#xff0c;一个小时奔波后来到了这里…… 大门口&#xff1a; 校领导&#xff1a; 有些破旧的校舍和阴沉的天空下祖国的希望&#xff1a; 同上&#xff0c;希望…… 期待的目光&#xff1a; 顽皮的笑脸&#xff0c;排着队也要调皮&#xf…

人体姿态估计算法之open pose

一&#xff0c;openpose是一种自底向上的算法&#xff1a; OpenPose人体姿态识别项目是美国卡耐基梅隆大学&#xff08;CMU&#xff09;基于卷积神经网络和监督学习并以Caffe为框架开发的开源库。可以实现人体动作、面部表情、手指运动等姿态估计。适用于单人和多人&am…

抢火车票这个事吧,其实我也能做!(python黑科技)

2019独角兽企业重金招聘Python工程师标准>>> 又是一年&#xff0c;马上就要回家过年了&#xff0c;还没有买到票的小伙伴们是否已经像热锅上的蚂蚁了无脑的开始找黄牛了? 俗话说的好&#xff0c;求人不如求自己&#xff0c;抢票这玩意&#xff0c;其实我觉得我也可…

用 Python+openpose 实现抖音尬舞机

游戏开始后&#xff0c;随着音乐会给出不同的动作提示&#xff0c;用户按照提示摆出正确动作即可得分。援引官方说法&#xff0c;“尬舞机”主要应用了今日头条 AI Lab 自主开发的“人体关键点检测技术”&#xff0c;依靠这项技术&#xff0c;抖音能够检测到图像中所包含人体的…

Create a Service Catalog Request via REST API

http://wiki.servicenow.com/index.php?titleUseful_Catalog_Scripts#Eureka http://wiki.servicenow.com/index.php?titleService_Catalog_Script_API#gsc.tab0 Service Catalog APIhttps://docs.servicenow.com/bundle/istanbul-servicenow-platform/page/integrate/inboun…

解密昇腾AI处理器--Ascend310简介

Ascend310 AI处理器规格 Ascend310 AI处理器逻辑架构 昇腾AI处理器本质上是一个片上系统&#xff08;System on Chip&#xff0c;SoC&#xff09;&#xff0c;主要可以应用在和图像、视频、语音、文字处理相关的应用场景。其主要的架构组成部件包括特制的计算单元、大容量的存储…

银盒子扫码下单在线订单开启商品售卖时段使用说明

1&#xff0c;登陆管理员账号&#xff0c;子账号下&#xff0c;配置管理--店铺配置--扫码下单Tab页&#xff0c;是否开启商品售卖时段&#xff0c;选择“是” 2&#xff0c;在商家后台登陆相应的子账号&#xff0c;在店铺管理--商品售卖时段里配置售卖时间以及相应时段售卖的商…

为什么早上和傍晚的太阳总是红色,而中午的大阳却是黄白色?

由太阳光本质决定&#xff0c;但会受环境影响。在地球上和火星上看到的太阳光也是有区别的&#xff0c;和太气层物质及厚薄也有关系。太阳光是由赤橙黄绿青蓝紫七色光组成的复合光是白色光。 在日出和日落的时候&#xff0c;地平线上所透过的大气层厚度&#xff0c;一般要比白…

java7

第八章 数组 1.数组的声明定义 数据类型[]变量名 new 数据类型[长度]; 列&#xff1a;int[]ary new int[5]; 2.取值&#xff0c;赋值 取值&#xff1a;数据名[下标]; 列&#xff1a;int a ary[1]; 赋值&#xff1a;变量数据名[…

串口波形分析

UART口发出数据按字节发送&#xff0c;发送数据8bit&#xff0c;实际量出波形为10bit&#xff0c;软件底层驱动会自动加上起始位和停止位各1bit&#xff0c;起始位为0&#xff0c;停止位为1。下图为用串口工具发送的数据和用示波器所量波形。 发送数据&#xff1a;0x34 0x43 示…

SpringBoot之MongoTemplate的查询可以怎么耍

学习一个新的数据库&#xff0c;一般怎么下手呢&#xff1f;基本的CURD没跑了&#xff0c;当可以熟练的增、删、改、查一个数据库时&#xff0c;可以说对这个数据库算是入门了&#xff0c;如果需要更进一步的话&#xff0c;就需要了解下数据库的特性&#xff0c;比如索引、事物…

LINQ to SQL 实现 GROUP BY、聚合、ORDER BY

前言 本示例主要实现 LINQ 查询&#xff0c;先分组&#xff0c;再聚合&#xff0c;最后在排序。示例很简单&#xff0c;但是使用 LINQ 却生成了不同的 SQL 实现。 1) 采用手动编写 SQL 实现 SELECT ROW_NUMBER() OVER(ORDER BY T.RealTotal DESC) AS SN, * FROM ( SELECT (S…

虚拟机增加内存方法

楼主由于要在虚拟机里面装一个oracle&#xff0c;在安装过程中&#xff0c;提示物理内存不符合最低标准&#xff0c;如图1. 图1 因为懒得新建一个虚拟机了&#xff0c;所以考虑给虚拟机新增磁盘空间。 首先说明&#xff0c;新增磁盘空间&#xff0c;必须保证当前虚拟机里每个新…

面对对象-封装

private 私有的 package/friendly/default 不写 protected 受保护的 public 公共的 那么什么情况该用什么修饰符呢&#xff1f;从作用域来看&#xff0c;public能够适用所有的情况。 但是大家在工作的时候&#xff0c;又不会真正全部都适用public,那么到底什么情况改用什么修饰…

本文详解5G是个什么鬼,程序员都准备好了吗?

无线移动通讯发展历史 最近5G的概念炒的如火如荼&#xff0c;为此&#xff0c;华为和高通还干了一仗。这篇文章从技术层面给大家分析&#xff0c;什么是5G&#xff0c;它和4G比&#xff0c;高级在哪里&#xff1f; 我们来看看移动互联网的技术发展&#xff1a; 然后我们在来看看…

Istio流量管理实践之(5): 使用cert-manager部署Istio自定义入口网关及进行证书管理...

Istio Gateway提供多个自定义入口网关的支持能力&#xff0c;通过开放一系列端口用于承载网格边缘的进入连接&#xff0c;同时可以使用不同loadbalancer来隔离不同的入口流量。cert-manager可用于使用存储在Kubernetes Secret资源中的任意签名密钥对来获取证书。本文提供了手动…

[bzoj3625][Codeforces 250 E]The Child and Binary Tree(生成函数+多项式运算+FFT)

3625: [Codeforces Round #250]小朋友和二叉树 Time Limit: 40 Sec Memory Limit: 256 MBSubmit: 650 Solved: 283[Submit][Status][Discuss]Description 我们的小朋友很喜欢计算机科学&#xff0c;而且尤其喜欢二叉树。考虑一个含有n个互异正整数的序列c[1],c[2],...,c[n]。…

子序列进阶问题

题目&#xff1a; 有一个数组&#xff0c;让找到两个不重复的连续子序列A,B &#xff0c;求Max(Sum(A)-Sum(B) 分析&#xff1a; AB必定连续&#xff0c;设两端连接处index为{X&#xff0c;x1}&#xff0c;X可取0~n-1 设F(x)为连接处index为{X&#xff0c;x1}时 Max(Sum(A)…