[bzoj2668]交换棋子
基本思路是,要让所有黑点都相对应(所以首先判断黑点的个数)。
如果没有交换限制,可以按以下方法建图:源点向所有初始黑点连(1,0)的边,最终黑点向汇点连(1,0)的边,相邻的两点连边(inf,1),最小费用最大流即可。
考虑限制,我们把交换分为两种:(将1)交换进来/交换出去,因此需要两条边(三个点)来限制次数
将一个点拆成三个点,记作i1,i2和i3,设交换次数为s,分类讨论:1.如果初始和结束颜色相同,说明交换了偶数次(因为不会交换相邻两个颜色相同的点),i1连向i2(s/2,0)的边,i2连向i3(s/2,0)的边;2.如果初始是黑色,结束是白色,i1连向i2(s/2,0)的边,i2连向i3((s+1)/2,0)的边;3.如果初始是白色,结束是黑色,i1连向i2((s+1)/2,0)的边,i2连向i3(s/2,0)的边。最后还要将相邻的3向1连一条边,源点和汇点与2相连。
1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 2005
4 #define id (n*m+i*m+j+1)
5 #define oo 0x3f3f3f3f
6 struct ji{
7 int nex,to,len,cost;
8 }edge[N*30];
9 queue<int>q;
10 int E,n,m,s1,s2,t,head[N],v[25][25],d[N],vis[N],from[N];
11 char s[N];
12 void add(int x,int y,int z,int w){
13 edge[E].nex=head[x];
14 edge[E].to=y;
15 edge[E].len=z;
16 edge[E].cost=w;
17 head[x]=E++;
18 if (E&1)add(y,x,0,-w);
19 }
20 bool spfa(){
21 memset(d,0x3f,sizeof(d));
22 memset(vis,0,sizeof(vis));
23 q.push(0);
24 d[0]=0;
25 while (!q.empty()){
26 int k=q.front();
27 q.pop();
28 vis[k]=0;
29 for(int i=head[k];i!=-1;i=edge[i].nex){
30 int v=edge[i].to;
31 if ((edge[i].len)&&(d[v]>d[k]+edge[i].cost)){
32 d[v]=d[k]+edge[i].cost;
33 from[v]=i;
34 if (!vis[v]){
35 vis[v]=1;
36 q.push(v);
37 }
38 }
39 }
40 }
41 return d[t]<0x3f3f3f3f;
42 }
43 int dinic(){
44 int len,ans1=0,ans2=0;
45 while (spfa()){
46 len=oo;
47 for(int i=t;i;i=edge[from[i]^1].to)len=min(len,edge[from[i]].len);
48 ans1+=len;
49 ans2+=len*d[t];
50 for(int i=t;i;i=edge[from[i]^1].to){
51 edge[from[i]].len-=len;
52 edge[from[i]^1].len+=len;
53 }
54 }
55 if (ans1<s1)ans2=-1;
56 return ans2;
57 }
58 int main(){
59 scanf("%d%d",&n,&m);
60 memset(head,-1,sizeof(head));
61 t=3*n*m+1;
62 for(int i=0;i<n;i++){
63 scanf("%s",s);
64 for(int j=0;j<m;j++)
65 if (s[j]=='1'){
66 s1++;
67 add(0,id,1,0);
68 v[i][j]++;
69 }
70 }
71 for(int i=0;i<n;i++){
72 scanf("%s",s);
73 for(int j=0;j<m;j++)
74 if (s[j]=='1'){
75 s2++;
76 add(id,t,1,0);
77 v[i][j]+=2;
78 }
79 }
80 for(int i=0;i<n;i++){
81 scanf("%s",s);
82 for(int j=0;j<m;j++){
83 add(id-n*m,id,(s[j]-'0'+(v[i][j]==2))/2,0);
84 add(id,id+n*m,(s[j]-'0'+(v[i][j]==1))/2,0);
85 for(int x=-1;x<2;x++)
86 for(int y=-1;y<2;y++)
87 if (((x)||(y))&&(i+x>-1)&&(i+x<n)&&(j+y>-1)&&(j+y<m))add(id+n*m,id+x*m+y-n*m,oo,1);
88 }
89 }
90 if (s1!=s2)printf("-1");
91 else printf("%d",dinic());
92 }
[bzoj2668]交换棋子的更多相关文章
- [CQOI2012][bzoj2668] 交换棋子 [费用流]
题面 传送门 思路 抖机灵 一开始看到这题我以为是棋盘模型-_-|| 然而现实是骨感的 后来我尝试使用插头dp来交换,然后又惨死 最后我不得不把目光转向那个总能化腐朽为神奇的算法:网络流 思维 我们要 ...
- 【BZOJ2668】[cqoi2012]交换棋子 费用流
[BZOJ2668][cqoi2012]交换棋子 Description 有一个n行m列的黑白棋盘,你每次可以交换两个相邻格子(相邻是指有公共边或公共顶点)中的棋子,最终达到目标状态.要求第i行第j列 ...
- 【BZOJ-2668】交换棋子 最小费用最大流
2668: [cqoi2012]交换棋子 Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 1055 Solved: 388[Submit][Status ...
- BZOJ2668: [cqoi2012]交换棋子
题解: 可以戳这里:http://www.cnblogs.com/zig-zag/archive/2013/04/21/3033485.html 其实自己yy一下就知道这样建图的正确性了. 感觉太神奇 ...
- BZOJ 2668: [cqoi2012]交换棋子
2668: [cqoi2012]交换棋子 Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 1112 Solved: 409[Submit][Status ...
- [cqoi2012]交换棋子
2668: [cqoi2012]交换棋子 Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 1334 Solved: 518[Submit][Stat ...
- BZOJ2668:[CQOI2012]交换棋子——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=2668 https://www.luogu.org/problemnew/show/P3159#sub ...
- BZOJ2668 [cqoi2012]交换棋子 【费用流】
题目链接 BZOJ2668 题解 容易想到由\(S\)向初始的黑点连边,由终态的黑点向\(T\)连边,然后相邻的点间连边 但是这样满足不了交换次数的限制,也无法计算答案 考虑如何满足一个点的交换次数限 ...
- BZOJ2668:[CQOI2012]交换棋子(费用流)
题目描述 有一个n行m列的黑白棋盘,你每次可以交换两个相邻格子(相邻是指有公共边或公共顶点)中的棋子,最终达到目标状态.要求第i行第j列的格子只能参与mi,j次交换. 输入输出格式 输入格式: 第一行 ...
随机推荐
- 实战经验分享:使用 PyO3 来构建你的 Python 模块
PyO3 主要用于创建原生 Python 的扩展模块.PyO3 还支持从 Rust 二进制文件运行 Python 代码并与之交互,可以实现 rust 与 Python 代码共存.在一些对性能要求较高的 ...
- 前段---css
css主要是用来做如何显示html元素的 当浏览器读到一个样式表,它就会按照这个样式表来对文档做渲染 注意:每一个css样式表都是由两个部分组成的, 1,选择器 2,声明 声明又包括属性值和属性,每个 ...
- Oracle-绑定执行计划
一.绑定执行计划 Oracle存在某个SQL多个执行计划的情况,那么如何快速将Oracle 好的执行计划,绑定到不好的SQL上呢? 由于版本的演进,绑定执行计划在10g 一般使用sql profile ...
- 指标统计:基于流计算 Oceanus(Flink) 实现实时 UVPV 统计
作者:吴云涛,腾讯 CSIG 高级工程师导语 | 最近梳理了一下如何用 Flink 来实现实时的 UV.PV 指标的统计,并和公司内微视部门的同事交流.然后针对该场景做了简化,并发现使用 Flink ...
- 5.31日 Scrum Metting
日期:2021年5月31日 会议主要内容概述:讨论草稿箱前后端接口,讨论账单页面设计. 一.进度情况 组员 负责 两日内已完成的工作 后两日计划完成的工作 工作中遇到的困难 徐宇龙 后端 文件导入功能 ...
- 「笔记」$Min\_25$筛
总之我也不知道这个奇怪的名字是怎么来的. \(Min\_25\)筛用来计算一类积性函数前缀和. 如果一个积性函数\(F(x)\)在质数单点是一个可以快速计算的关于此质数的多项式. 那么可以用\(Min ...
- 不可错过的stm32单片机直流电机驱动与测速详解
stm32直流电机驱动与测速 说实话就现在的市场应用中stm32已经占到了绝对住到的地位,51已经成为过去式,32的功能更加强大,虽然相应的难度有所增加,但是依然阻止不了大家学习32的脚步,不说大话了 ...
- TCP/IP参考模型(应用层、传输层、网际层、网络接口层)、五层参考模型(应用层、传输层、网络层、数据链路层、物理层)、OSI与TCP/IP参考模型比较
文章转自:https://blog.csdn.net/weixin_43914604/article/details/104597450 学习课程:<2019王道考研计算机网络> 学习目的 ...
- Java RMI学习与解读(二)
Java RMI学习与解读(二) 写在前面 接上篇文章,这篇主要是跟着看下整个RMI过程中的源码并对其做简单的分析 RMI源码分析 还是先回顾下RMI流程: 创建远程对象接口(RemoteInterf ...
- ES查询区分大小写
ES查询区分大小写 ES查询在默认的情况下是不区分大小写的,在5.0版本之后将string类型拆分成两种新的数据类型,text用于全文搜索(模糊搜索),keyword用于关键字搜索(精确搜索). 注意 ...