[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次交换. 输入输出格式 输入格式: 第一行 ...
随机推荐
- 基于querybuilder的可根据现有数据表自动生成Restful API的dotnet中间件
AutoApi 基于SqlKata Query Builder的可根据数据表自动生成Restful API的dotnet中间件 项目地址 Github Gitee 支持的数据库 MySql AutoA ...
- 洛谷4847 银河英雄传说(LCT+LCSPLAY)
QWQ硬是把一个\(splay\)好题,做成了\(LCT\) 首先,根据题目性质,我们可以发现序列之间是具有前后性质的. 那么,我们就不可以进行\(makeroot\)等操作. 我们定义\(findr ...
- AES解密尾部出现乱码问题
说明 在使用AES解密的时候我发现解密出来的字符串尾部一直都有乱码 解决方案 尾部字符串的ascii码就是删除位索引 具体代码: cryptor = AES.new('AES_KEY'.encode( ...
- HTTP状态码 详细解析汇总
一.状态码的类别: 类别 原因短语1XX Informational(信息性状态码) 接受的请求正在处理2XX Success(成功状态码) 请求正常处理完毕3XX Redirection(重定向状态 ...
- Django开发个人博客入门学习经验贴
[写在前面] 入门学习搭建个人博客系统首先还是参考大佬们的经验,记得刚入手Django的时候,一篇博客大佬说过一句话,做技术的不要一开始就扎头于细节中,先把握整体框架,了解这个对象之后再去了解细节,进 ...
- python join的用法
joinn其实就相当于用某个字符串来拼接列表或者元组中的元素 当然也可以将字符串以某一个str拼接起来 得出的结果自然也是字符串 ex1: results: 实例用处: 当我们从某个文件中读出内容时, ...
- UltraSoft - Alpha - 发布声明
DDL_Killer Alpha版本发布声明 1. Alpha 阶段功能描述与版本实现 功能描述 设计原型 Alpha实现 登陆界面 注册界面 首页 日历视图 事项详情页 新建事项 列表视图 课程视图 ...
- Vue报错 type check failed for prop “xxx“. Expected String with value “xx“,got Number with value ‘xx‘
vue报错 [Vue warn]: Invalid prop: type check failed for prop "name". Expected String with ...
- 【BZOJ 1419】Red is good [概率DP]
我 是 Z Z 概率好玄啊(好吧是我太弱.jpg Description 桌面上有R张红牌和B张黑牌,随机打乱顺序后放在桌面上,开始一张一张地翻牌,翻到红牌得到1美元,黑牌则付出1美元.可以随时停止翻 ...
- 图像原始格式(YUV444 YUV422 YUV420)一探究竟
前段时间搞x264编码测试,传参的时候需要告诉编码器我的原始数据格式是什么,其中在x264.h头文件中定义了如下一堆类型. /* Colorspace type */ #define X264_CSP ...