$pdf\space solution$    link

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<climits>
#include<queue>
using namespace std;
inline int read(){
int f=,ans=;char c=getchar();
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){ans=ans*+c-'';c=getchar();}
return f*ans;
}
queue<int> que;
const int MAXN=;
const int N=;
struct node{
int u,v,cost,w,nex;
}x[MAXN<<];
int head[MAXN],S,T,cnt,dis[MAXN],vis[MAXN],cost,INF=INT_MAX;
void add(int u,int v,int cost,int w){
// printf("u:%d v:%d cost:%d w:%d\n",u,v,cost,w);
x[cnt].u=u,x[cnt].v=v,x[cnt].cost=cost,x[cnt].w=w,x[cnt].nex=head[u],head[u]=cnt++;swap(u,v),w=,cost=-cost;
x[cnt].u=u,x[cnt].v=v,x[cnt].cost=cost,x[cnt].w=w,x[cnt].nex=head[u],head[u]=cnt++;
}
bool spfa(){
memset(dis,/,sizeof(dis)),memset(vis,,sizeof(vis));
int inf=dis[];dis[S]=,vis[S]=,que.push(S);
while(!que.empty()){
int xx=que.front();que.pop();
for(int i=head[xx];i!=-;i=x[i].nex){
if(x[i].w&&dis[x[i].v]>dis[xx]+x[i].cost){
dis[x[i].v]=dis[xx]+x[i].cost;
if(!vis[x[i].v]) vis[x[i].v]=,que.push(x[i].v);
}
}vis[xx]=;
}return dis[T]!=inf;
}
int dfs(int u,int flow){
// printf("u:%d flow:%d\n",u,flow);
if(u==T) return flow;
int used=;vis[u]=;
for(int i=head[u];i!=-;i=x[i].nex){
if(x[i].w&&dis[x[i].v]==dis[u]+x[i].cost&&!vis[x[i].v]){
int slow=dfs(x[i].v,min(flow-used,x[i].w));used+=slow;
x[i].w-=slow,x[i^].w+=slow;
cost+=slow*x[i].cost;
if(used==flow) break;
}
}if(!used) dis[u]=-;
vis[u]=;
return used;
}
int dinic(){
int ans=;cost=;
while(spfa()){memset(vis,,sizeof(vis)),ans+=dfs(S,INF);}
return ans;
}
char A[N][N],B[N][N],lim[N][N];
int n,m,sum;
int dx[]={,,,-,-,-,,};
int dy[]={,,-,,,-,,-};
int Q(int x,int y){return (x-)*m+y;}
int main(){
// freopen("8.in","r",stdin);
memset(head,-,sizeof(head));
n=read(),m=read();S=,T=n*m*+;
for(int i=;i<=n;i++) scanf("%s",A[i]+);
for(int i=;i<=n;i++) scanf("%s",B[i]+);
for(int i=;i<=n;i++) scanf("%s",lim[i]+);
for(int i=;i<=n;i++)
for(int j=;j<=m;j++){
if(A[i][j]==B[i][j]&&A[i][j]==) continue;
A[i][j]-='',B[i][j]-='',lim[i][j]-='';
if(A[i][j]==B[i][j]){ add(Q(i,j),Q(i,j)+n*m,,lim[i][j]/);
add(Q(i,j)+*n*m,Q(i,j),,lim[i][j]); continue;
}
if(A[i][j]==){
sum++;
add(S,Q(i,j),,);
add(Q(i,j),Q(i,j)+n*m,,(lim[i][j]+)/);
add(Q(i,j)+*n*m,Q(i,j),,(lim[i][j]-)/);
continue;
}
if(B[i][j]==){
add(Q(i,j),Q(i,j)+n*m,,(lim[i][j]-)/);
add(Q(i,j)+*n*m,Q(i,j),,(lim[i][j]+)/);
add(Q(i,j),T,,);
}
}
for(int i=;i<=n;i++){
for(int j=;j<=m;j++){
for(int k=;k<;k++){
int bx=i+dx[k],by=j+dy[k];
if(bx>=&&bx<=n&&by>=&&by<=m){
add(Q(i,j)+n*m,Q(bx,by)+*n*m,,INF);
}
}
}
}
int Ans=dinic();
if(Ans!=sum){printf("-1");return ;}
printf("%d\n",cost);
}/*
1 2
1 0
0 1
1 1
*/

[CQOI2012] 交换棋子 (费用流)的更多相关文章

  1. 【BZOJ2668】[cqoi2012]交换棋子 费用流

    [BZOJ2668][cqoi2012]交换棋子 Description 有一个n行m列的黑白棋盘,你每次可以交换两个相邻格子(相邻是指有公共边或公共顶点)中的棋子,最终达到目标状态.要求第i行第j列 ...

  2. BZOJ2668: [cqoi2012]交换棋子(费用流)

    Description 有一个n行m列的黑白棋盘,你每次可以交换两个相邻格子(相邻是指有公共边或公共顶点)中的棋子,最终达到目标状态.要求第i行第j列的格子只能参与mi,j次交换. Input 第一行 ...

  3. [CQOI2012] 交换棋子 - 费用流

    有一个n行m列的黑白棋盘,你每次可以交换两个相邻格子(相邻是指有公共边或公共顶点)中的棋子,最终达到目标状态.要求第i行第j列的格子只能参与mi,j次交换. Solution 一个点拆三份,入点,主点 ...

  4. BZOJ.2668.[CQOI2012]交换棋子(费用流zkw)

    题目链接 首先黑白棋子的交换等价于黑棋子在白格子图上移动,都到达指定位置. 在这假设我们知道这题用网络流做. 那么黑棋到指定位置就是一条路径,考虑怎么用流模拟出这条路径. 我们发现除了路径的起点和终点 ...

  5. [CQOI2012][bzoj2668] 交换棋子 [费用流]

    题面 传送门 思路 抖机灵 一开始看到这题我以为是棋盘模型-_-|| 然而现实是骨感的 后来我尝试使用插头dp来交换,然后又惨死 最后我不得不把目光转向那个总能化腐朽为神奇的算法:网络流 思维 我们要 ...

  6. [cqoi2012]交换棋子

      2668: [cqoi2012]交换棋子 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 1334  Solved: 518[Submit][Stat ...

  7. BZOJ 2668: [cqoi2012]交换棋子

    2668: [cqoi2012]交换棋子 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 1112  Solved: 409[Submit][Status ...

  8. BZOJ2668: [cqoi2012]交换棋子

    题解: 可以戳这里:http://www.cnblogs.com/zig-zag/archive/2013/04/21/3033485.html 其实自己yy一下就知道这样建图的正确性了. 感觉太神奇 ...

  9. BZOJ2668:[CQOI2012]交换棋子(费用流)

    题目描述 有一个n行m列的黑白棋盘,你每次可以交换两个相邻格子(相邻是指有公共边或公共顶点)中的棋子,最终达到目标状态.要求第i行第j列的格子只能参与mi,j次交换. 输入输出格式 输入格式: 第一行 ...

  10. [luoguP3159] [CQOI2012]交换棋子(最小费用最大流)

    传送门 好难的网络流啊,建图真的超难. 如果不告诉我是网络流的话,我估计就会写dfs了. 使用费用流解决本题,设点 $p[i][j]$ 的参与交换的次数上限为 $v[i][j]$ ,以下为建图方式: ...

随机推荐

  1. 解决maven update project 后项目jdk变成1.5

    http://blog.csdn.net/jay_1989/article/details/52687934

  2. M1阶段的开发过程的一些反思

    今天八组队伍都做了项目的展示,和他们相比,我们的团队项目是显得最单薄的了,这里面的原因很多,固然我们团队整体的实力 比较弱,但是我们在M1项目开发过程中的种种错误表现也是导致我们项目失利的重要原因.下 ...

  3. beta冲刺(5/7)

    目录 组员情况 组员1(组长):胡绪佩 组员2:胡青元 组员3:庄卉 组员4:家灿 组员5:恺琳 组员6:翟丹丹 组员7:何家伟 组员情况 组员1(组长):胡绪佩 组员2:胡青元 组员3:庄卉 组员4 ...

  4. Myeclipse(2014)项目的注释乱码

    (之前都是在项目右键 propertits----resource---text file encoding 里面改成UTF-8的 下面是以后都直接换) window->preference-& ...

  5. java集合ArrayList

    基于jdk_1.8.0 关于List,主要是有序的可重复的数据结构.jdk主要实现类有ArrayList(底层使用数组).LinkedList(底层使用双向链表) ArrayList: (一)继承关系 ...

  6. J2EE 13种技术规范

    J2EE平台由一整套服务(种技术规范进行简单的描述(限于篇幅,这里只能进行简单的描述): 1.JDBC(Java Database Connectivity):    JDBC API为访问不同的数据 ...

  7. 由一个滑动条的任务需求产生一个对UISlider控件的探讨

    任务需求样式:

  8. jQuery 版本选择与常见插件库总结

    在日常的开发中jQuery作为一个流行多年的轻量级 JavaScript 库,使用十分的普遍,主要源于它的便捷性和实用性非常高. 在此总结一些关于jQuery版本的区别和选择的建议,以及一些常见插件库 ...

  9. 使用Fiddler后谷歌浏览器访问https不安全

    今天初次接触java爬虫,师兄给了一个软件加一个demo,软件是Fiddler,在网上找资料稍微学习了一下,自己一顿乱配...然后gg,谷歌浏览器访问https协议时都提示不安全,“您的链接不是一个私 ...

  10. Python日记——nginx+Gunicorn部署你的Flask项目

    转自:http://blog.csdn.net/qq_32198277/article/details/52432890 大家在学习Python的时候常常都是输入 python 文件名.py   这样 ...