错了,全部错了

感觉还是挺有难度的吧。。

其实最小割在这种最大/最小化代价的问题上的拓展性是比最大流要好的,甚至有些问题用最大流建模后不好求而要转化为求最小割(例如
CF1368H Breadboard Capacity,但是也不绝对,有极少数题是用最小割建模,然后转化成最大流)。究其原因还是最小割的定义比较讨喜(把点分成 S , T S,T S,T两个集合,使得 S S S T T T的边权和最小)。比较经典的例子就是最大权闭合子图(关键在于,每个点只有 0 , 1 0,1 0,1两个状态,只有当 x i = 0 , x j = 1 x_i=0,x_j=1 xi=0,xj=1的时候才会有代价,如果拆出来 x i = x j = 0 / 1 x_i=x_j=0/1 xi=xj=0/1的时候也有代价就做不了,或者可以尝试把状态反转一下)。

我第一眼想的是建二分图,然后两两之间连边之类的,但是发现只能求最大代价。究其原因在于贡献拆出来是 A i , j 2 + A i + 1 , j 2 − 2 A i , j A i + 1 , j A_{i,j}^2+A_{i+1,j}^2-2A_{i,j}A_{i+1,j} Ai,j2+Ai+1,j22Ai,jAi+1,j,我们要的是最小也就是带负号的那一坨尽量大,但是最小割是让割的边和最小所以就不对。

这告诉我们两件事情,首先,如果题目是最小化代价的话,那么最小割对应的代价一定要是非负的,否则做不了;其次,我上面采用的定义是割边权和最小的边使得 S S S T T T不连通,从这一例可以看出这一定义在很多情况下十分糟糕(但是有的题这样做比较直观,比如 [ARC176E] Max Vector)。

所以还是使用更为通用的定义——划分集合 S , T S,T S,T,并且摒弃掉二分图的结构(后面发现难以同时处理掉 a > b a>b a>b a < b a<b a<b两种对称的情况),同时淡化源点和汇点。还是建立一条长度为 4 4 4的从左往右延伸的链,容易发现此时是一段前缀划分到 T T T,后缀划分到 S S S。可以定义此时这个位置上的数为 S S S的大小 + 1 +1 +1,于是 A i , j ≠ 0 A_{i,j}\ne 0 Ai,j=0的情况就很好刻画了:将 v x , 5 − t v_{x,5-t} vx,5t划分到 T T T v x , 6 − t v_{x,6-t} vx,6t划分到 S S S,具体连边不再赘述。

然后,如题解所说,记 s ( a , b ) ( a < b ) s(a,b)(a<b) s(a,b)(a<b)表示 A x = a , A y = b A_x=a,A_y=b Ax=a,Ay=b对应的贡献,考虑将其拆分成:

s ( a , b ) = ∑ a < i ≤ j ≤ b w ( i , j ) s(a,b)=\sum_{a<i\le j\le b}w(i,j) s(a,b)=a<ijbw(i,j)

其中 w ( i , j ) w(i,j) w(i,j)为非负数。 容易发现 w ( i , j ) = 1 + [ i < j ] w(i,j)=1+[i<j] w(i,j)=1+[i<j],所以我们枚举所有 ( i , j ) (i,j) (i,j),翻译过来就是当 v y , 6 − i = 1 v_{y,6-i}=1 vy,6i=1并且 v x , 6 − j = 0 v_{x,6-j}=0 vx,6j=0时会产生 w ( i , j ) w(i,j) w(i,j)的贡献。显然连边应该是对称的。

本题中 d = 4 d=4 d=4,这样拆出来大概有 n 2 d n^2d n2d个点以及 n 2 d 2 n^2d^2 n2d2条边,显然可以通过。

还有一个地方,不难发现 w ( i , j ) w(i,j) w(i,j)就是二维差分的形式,所以其实是定值(可以直接算,不用构造),所以只要 s ( i , j ) s(i,j) s(i,j)二维差分的值非负就可以这样做。

输出方案就DFS找能和 S S S联通的点即可。

#include<bits/stdc++.h>
#define ll long long
#define pb push_back
#define db double
#define fi first
#define se second
#define inf 0x3f3f3f3f
using namespace std;
const int N=10005;
const int M=100005;
int n,m,s,t,idx,a[25][25],id[25][25][5];
int dx[4]={-1,1,0,0},dy[4]={0,0,-1,1};
int head[M],nxt[M],to[M],cap[M],tot=1;
bool vs[N];
int cur[N],lab[N];
int que[N],qhead,qtail;
void add(int u,int v,int w){tot++,to[tot]=v,cap[tot]=w,nxt[tot]=head[u],head[u]=tot;tot++,to[tot]=u,cap[tot]=0,nxt[tot]=head[v],head[v]=tot;
}
void init(){for(int i=1;i<=idx;i++)head[i]=0;idx=0,tot=1;
}
bool BFS(int s,int t){for(int i=1;i<=idx;i++)lab[i]=0;lab[s]=1;qhead=qtail=0;que[qtail++]=s;while(qhead!=qtail){int u=que[qhead++];for(int k=head[u];k;k=nxt[k]){int v=to[k];if(cap[k]>0&&lab[v]==0){lab[v]=lab[u]+1;que[qtail++]=v;}}}return lab[t]!=0;
}
int flow(int u,int t,int limit){if(u==t)return limit;int used=0;for(int &k=cur[u];k;k=nxt[k]){int v=to[k];if(cap[k]>0&&lab[u]+1==lab[v]){int tmp=min(limit-used,cap[k]);int ret=flow(v,t,tmp);used+=ret;cap[k]-=ret;cap[k^1]+=ret;if(limit==used)break;}}return used;
}
int dinic(int s,int t){int tmp=0;while(BFS(s,t)){for(int i=1;i<=idx;i++)cur[i]=head[i];tmp+=flow(s,t,inf);}return tmp;
}
void dfs(int u){vs[u]=1;for(int k=head[u];k;k=nxt[k]){if(!cap[k])continue;int v=to[k];if(!vs[v])dfs(v);}
}
signed main(){//freopen("data.in","r",stdin);ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);cin>>n;s=++idx,t=++idx;for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){cin>>a[i][j];for(int k=1;k<=4;k++)id[i][j][k]=++idx;for(int k=1;k<4;k++)add(id[i][j][k],id[i][j][k+1],inf);}}for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){if(a[i][j]){int x=a[i][j];if(5-x>=1)add(id[i][j][5-x],t,inf);if(6-x<=4)add(s,id[i][j][6-x],inf);}for(int k=0;k<4;k++){int ti=i+dx[k],tj=j+dy[k];if(ti<1||ti>n||tj<1||tj>n)continue;for(int x=2;x<=5;x++){for(int y=x;y<=5;y++){add(id[i][j][6-y],id[ti][tj][6-x],1+(x<y));}}}}}dinic(s,t);dfs(s);for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){int x=1;for(int k=1;k<=4;k++){if(vs[id[i][j][k]]){x=6-k;break;}}cout<<x<<" ";}cout<<"\n";}
}

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

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

相关文章

力扣HOT100 - 2. 两数相加

解题思路&#xff1a; 缺位的节点进行补零处理&#xff0c;如97323补充为973023 注意相加的进位问题 class Solution {public ListNode addTwoNumbers(ListNode l1, ListNode l2) {ListNode head null, tail null;int carry 0;while (l1 ! null || l2 ! null) {int n1 l…

2013-2021年各省经济韧性相关测度指标面板数据

2013-2021年各省经济韧性相关测度指标面板数据 1、时间&#xff1a;2013-2021年 2、指标&#xff1a;城镇化率 %、财政科学技术支出&#xff08;亿元&#xff09;、万人高等教育在校人数&#xff08;万人&#xff09;、财政教育支出&#xff08;亿元&#xff09;、第三产业占…

semaphore信号量使用+原理分析

1.概述 Semaphore 信号量&#xff0c;相当于一个计数器&#xff0c;通常用来限制线程的数量。 每个线程操作前会先获取一个许可证&#xff0c;逻辑处理完成之后就归还这个许可证。 通俗的解释&#xff1a;相当于一个停车场&#xff0c;有10个停车位&#xff0c;进来一个车&am…

QtCharts 组件

Qtcharts 组件基于GraphicsView模式实现&#xff0c;其核心是QChartView和QChart的二次封装版。 在pro文件中包含QT charts来引入绘图类库。 头文件中定义QT_CHARTS_USE_NAMESPACE宏&#xff0c;这样才可以正常的使用绘图功能。 一般情况下我们会在mainwindows.h头文件中增…

本地部署Docker容器可视化图形管理工具DockerUI并实现无公网IP远程访问——“cpolar内网穿透”

文章目录 前言1. 安装部署DockerUI2. 安装cpolar内网穿透3. 配置DockerUI公网访问地址4. 公网远程访问DockerUI5. 固定DockerUI公网地址 前言 DockerUI是一个docker容器镜像的可视化图形化管理工具。DockerUI可以用来轻松构建、管理和维护docker环境。它是完全开源且免费的。基…

stack、queue(priority_queue)的模拟实现和deque的简单介绍

stack和queue(priority_queue) 1. 容器适配器 适配器(Adapter)&#xff1a;一种用来修饰容器(Containers)或仿函数(Functors)或迭代器(Iterator)接口的东西。 适配器是一种设计模式&#xff0c;该模式将一个类的接口转换成客户希望的另外一个接口。 现实中拿插座来说&#xf…

LeetCode 每日一题 Day 137-143

928. 尽量减少恶意软件的传播 II(Hard) 给定一个由 n 个节点组成的网络&#xff0c;用 n x n 个邻接矩阵 graph 表示。在节点网络中&#xff0c;只有当 graph[i][j] 1 时&#xff0c;节点 i 能够直接连接到另一个节点 j。 一些节点 initial 最初被恶意软件感染。只要两个节点…

llm构建知识库

构建词向量库 在RAG应用中&#xff0c;我们需要大模型调用知识库中的专业内容对用户的提问进行更加完善的回答&#xff0c;因此如何为llm引入知识库便尤为关键&#xff0c;在本篇内容中&#xff0c;我会从基础的词向量开始介绍&#xff0c;最终到如何完成一个可供llm调用的向量…

C语言进阶课程学习记录- 函数与宏分析

C语言进阶课程学习记录- 函数与宏分析 实验-宏和函数实验-宏的副作用实验-宏的妙用小结 本文学习自狄泰软件学院 唐佐林老师的 C语言进阶课程&#xff0c;图片全部来源于课程PPT&#xff0c;仅用于个人学习记录 实验-宏和函数 #include <stdio.h>#define RESET(p, len) …

程序员开发必备,开发资源资料分享【3】

第2部分内容 090-100036401-专栏课-聂鹏程-分布式技术原理与算法解析&#xff08;完结&#xff09;提取码&#xff1a; 091-100036501-专栏课-王健-说透中台&#xff08;完结&#xff09;提取码&#xff1a; 092-100036601-专栏课-石雪峰-DevOps 实战笔记&#xff08;完结&a…

【Nginx】centos和Ubuntu操作系统下载Nginx配置文件并启动Nginx服务详解

目录 &#x1f337; 安装Nginx环境 &#x1f340; centos操作系统 &#x1f340; ubuntu操作系统 &#x1f337; 安装Nginx环境 以下是在linux系统中安装Nginx的步骤&#xff1a; 查看服务器属于哪个操作系统 cat /etc/os-release安装 yum&#xff1a; 如果你确定你的系统…

Spring是如何解决循环依赖的

简介 所谓循环依赖指的是&#xff1a;BeanA对象的创建依赖于BeanB&#xff0c;BeanB对象的创建也依赖于BeanA&#xff0c;这就造成了死循环&#xff0c;如果不做处理的话势必会造成栈溢出。Spring通过提前曝光机制&#xff0c;利用三级缓存解决循环依赖问题。 变量描述single…

RU 19.23 安装

分别通过对GRID_HOME和ORACLE_HOME进行安装补丁的方式。来安装RU19.23 。 前面的相关检查等步骤&#xff0c;略。 安装RU的过程 1 分别最GRID_HOME安装RU 2 分别对ORACLE_HOME安装RU 3 升级catalog &#xff08;如有必要&#xff09; 4 其他事项 1 对GRID HOME安装ru # opatch…

【C语言__指针01__复习篇11】

目录 前言 一、什么是指针 二、计算机中常见的单位 三、CPU是怎样找到一块内存空间的 四、如何得到变量的地址 五、指针变量 六、解引用指针变量的作用 七、指针变量的大小 八、指针变量类型的意义 8.1 指针的解引用 8.2 指针-整数 九、void*指针 十、const修饰变…

搜维尔科技:Haption Virtuose 6D TAO 力反馈设备,专为机器人的和遥操作市场设计

HaptionVirtuose 6D TAO 力反馈设备&#xff0c;专为机器人的和遥操作市场设计 搜维尔科技&#xff1a;Haption Virtuose 6D TAO 力反馈设备&#xff0c;专为机器人的和遥操作市场设计

【Ansible】01

自动化运维 Ansible Ansible首发于2012年 , 2015年被收购 Ansible是一款自动化运维工具 , 基于 Python 开发 基于ssh进行管理 , 不需要在被管理端安装任何软件 Ansible主要是通过各种模块进行操作 批量系统配置 批量程序部署 批量运行命令等功能 环境准备 控制节点主…

PCB走线宽度、PCB走线宽度计算、PCB走线宽度和电流

目录 一、什么是PCB走线宽度&#xff1f; 二、什么是走线&#xff1f; 三、哪些因素对走线宽度至关重要&#xff1f; 1、信号走线 2、电源走线 3、直线宽度和信号反射 四、怎么计算PCB走线宽度&#xff1f; 1、使用PCB走线宽度计算器 2、使用方程式 五、怎么计算PCB 走…

UGUI父对象自适应子元素布局解决方案

问题描述 在UI开发中&#xff0c;难免会遇到需要父对象自适应子元素尺寸的问题&#xff0c;这通常是为了解决不同屏幕分辨率的UI自适应问题。实际上我们去仔细了解UGUI的布局组件的原理就能够合理配置组件来解决这个问题。 案例问题&#xff1a;例如我现在有一个背景面板&#…

25计算机考研院校数据分析 | 上海交通大学

上海交通大学电子信息与电气工程学院成立于2001年12月&#xff0c;其前身可湖源至百年前的电机专科&#xff0c;具有中国电气工程师“摇篮”之美称。50年代根据学科发展需要分为电工与计算机科学系(三系)和电子工程系(四系)。1985年&#xff0c;三系和四系合并&#xff0c;成立…

Abaqus2024 安装教程(附免费安装包资源)

鼠标右击软件压缩包&#xff0c;选择“解压到Abaqus2024”。 鼠标右击“此电脑”&#xff0c;选择“属性”。 点击“高级系统设置”。 点击“环境变量”。 点击“新建”。 变量名输入&#xff1a;NOLICENSECHECK 变量值输入&#xff1a;true 然后点击“确定”。 点击“确定”。…