$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. RAID卡的结构详解

    软件RAID的缺点如此之多,使人们不断地思考更多实现RAID的方法.既然软件缺点太多,那么用硬件实现如何呢? RAID卡就是一种利用独立硬件来实现RAID功能的方法.要在硬件上实现RAID功能,必须找 ...

  2. 基础的 sparkSQL操作

    spark连接mysql操作 数据库jdbc 连接封装 package test.com import org.apache.spark.sql.{DataFrame, SparkSession} / ...

  3. 2015第六届蓝桥杯C/C++ B组

    奖券数目:枚举 有些人很迷信数字,比如带“4”的数字,认为和“死”谐音,就觉得不吉利.虽然这些说法纯属无稽之谈,但有时还要迎合大众的需求.某抽奖活动的奖券号码是5位数(10000-99999),要求其 ...

  4. Paxos共识算法

    Paxos共识算法 paxos是一族用来解决分布式系统共识的基础算法,共识过程就是在一组节点上达成一个一致的结果.由于节点可能会错误,通讯消息也可能会丢失,所以建立共识是一个比较复杂的过程. paxo ...

  5. Vue.js 相关知识(组件)

    1. 组件介绍 组件(component),vue.js最强大的功能之一 作用:封装可重用的代码,通常一个组件就是一个功能体,便于在多个地方都能调用该功能体 根组件:我们实例化的Vue对象就是一个组件 ...

  6. RN 离线包集成后需要注意的一些问题

    1.ReactNative 开发中如何去掉iOS状态栏的"Loading from..." 等淡黑色的弹框,很难看? 在 AppDelegate.h 中引入: #import &l ...

  7. 在WPF里实现计算器软件

    一.具体代码 类代码: using System; using System.Collections.Generic; using System.Linq; using System.Text; us ...

  8. HDU 4405 Aeroplane chess 期望dp

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4405 Aeroplane chess Time Limit: 2000/1000 MS (Java/ ...

  9. 【搜索】POJ-3669 BFS

    一.题目 Description Bessie hears that an extraordinary meteor shower is coming; reports say that these ...

  10. 学习Web Service、wcf、webapi的区别

    csdn:关于wcf,webservice,webapi或者其他服务或者接口有什么区别. wcf,webservice采用的是rpc协议,这个协议很复杂,所以每次要传递.要校验的内容也很复杂,别看我们 ...