[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次交换. 输入输出格式 输入格式: 第一行 ...
随机推荐
- 关于我的Visual Studio2017修改安装重试9次失败问题解决
环境:windows vs2017 现象描述:本来我的vs可用的,一天想暗爪QT,插件安装好了不能创建QT项目,准备升级,然后问题出现了. 过程: 把人弄崩溃了,二三十k的速度在走,半路又终止.根本不 ...
- mysql中一半会选择什么样的字段为索引?(含索引创建删除查看公式)
一.数据量庞大的数据做索引 二.该字段经常出现在where的后面,以条件形式存在,经常被用户搜索的字段 三.很少被增删改的字段,因为增删改后,索引会重新排序 索引的创建 create index 索引 ...
- SpringBoot-使用异步
SpringBoot提供了异步的支持,上手使用十分的简单,只需要开启一些注解支持,配置一些配置文件即可! 编写方法,假装正在处理数据,使用线程设置一些延时,模拟同步等待的情况: service: @S ...
- 面试官:Java从编译到执行,发生了什么?
面试官:今天从基础先问起吧,你是怎么理解Java是一门「跨平台」的语言,也就是「一次编译,到处运行的」? 候选者:很好理解啊,因为我们有JVM. 候选者:Java源代码会被编译为class文件,cla ...
- 消息队列那么多,为什么建议深入了解下RabbitMQ?
你为啥要在项目中选择xxx消息中间件? 提起消息队列,也许你的脑海里会不自觉地蹦出好多概念:JMS.Kafka.RocketMQ.AMQP.RabbitMQ.ActiveMQ.Pulsar.Redis ...
- Mac录屏同时录制系统声音和画外音(Soundflower无法安装解决方案)
个人博客地址:xzajyjs.cn 前言 以前一直有录屏的需求,但苦于自带的QuickTime 无法录制内屏声音,一直使用的是第三方的app.近期开腾讯会议需要录屏,但主持人本身没有开启录屏权限,只好 ...
- Noip模拟47 2021.8.25
期望得分:55+24+53 实际得分:0+0+3 乐死 累加变量清零了吗? 打出更高的部分分暴力删了吗? 样例解释换行你看见了吗? T1 Prime 打出55分做法没删原来的暴力,结果就轻松挂55分 ...
- (转)linux下execl和system函数
linux下,system函数和execl函数都是用于执行一条系统命令.今天仔细看了system函数的实现,想找出和execl函数的差别. 这里先进行一些背景知识补充: fork(创建一个新的进程): ...
- 跳台阶 牛客网 剑指Offer
跳台阶 牛客网 剑指Offer 题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果). class Solution: #ru ...
- 近期业务大量突增微服务性能优化总结-3.针对 x86 云环境改进异步日志等待策略
最近,业务增长的很迅猛,对于我们后台这块也是一个不小的挑战,这次遇到的核心业务接口的性能瓶颈,并不是单独的一个问题导致的,而是几个问题揉在一起:我们解决一个之后,发上线,之后发现还有另一个的性能瓶颈问 ...