[CQOI2012] 交换棋子 (费用流)
#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] 交换棋子 (费用流)的更多相关文章
- 【BZOJ2668】[cqoi2012]交换棋子 费用流
[BZOJ2668][cqoi2012]交换棋子 Description 有一个n行m列的黑白棋盘,你每次可以交换两个相邻格子(相邻是指有公共边或公共顶点)中的棋子,最终达到目标状态.要求第i行第j列 ...
- BZOJ2668: [cqoi2012]交换棋子(费用流)
Description 有一个n行m列的黑白棋盘,你每次可以交换两个相邻格子(相邻是指有公共边或公共顶点)中的棋子,最终达到目标状态.要求第i行第j列的格子只能参与mi,j次交换. Input 第一行 ...
- [CQOI2012] 交换棋子 - 费用流
有一个n行m列的黑白棋盘,你每次可以交换两个相邻格子(相邻是指有公共边或公共顶点)中的棋子,最终达到目标状态.要求第i行第j列的格子只能参与mi,j次交换. Solution 一个点拆三份,入点,主点 ...
- BZOJ.2668.[CQOI2012]交换棋子(费用流zkw)
题目链接 首先黑白棋子的交换等价于黑棋子在白格子图上移动,都到达指定位置. 在这假设我们知道这题用网络流做. 那么黑棋到指定位置就是一条路径,考虑怎么用流模拟出这条路径. 我们发现除了路径的起点和终点 ...
- [CQOI2012][bzoj2668] 交换棋子 [费用流]
题面 传送门 思路 抖机灵 一开始看到这题我以为是棋盘模型-_-|| 然而现实是骨感的 后来我尝试使用插头dp来交换,然后又惨死 最后我不得不把目光转向那个总能化腐朽为神奇的算法:网络流 思维 我们要 ...
- [cqoi2012]交换棋子
2668: [cqoi2012]交换棋子 Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 1334 Solved: 518[Submit][Stat ...
- BZOJ 2668: [cqoi2012]交换棋子
2668: [cqoi2012]交换棋子 Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 1112 Solved: 409[Submit][Status ...
- BZOJ2668: [cqoi2012]交换棋子
题解: 可以戳这里:http://www.cnblogs.com/zig-zag/archive/2013/04/21/3033485.html 其实自己yy一下就知道这样建图的正确性了. 感觉太神奇 ...
- BZOJ2668:[CQOI2012]交换棋子(费用流)
题目描述 有一个n行m列的黑白棋盘,你每次可以交换两个相邻格子(相邻是指有公共边或公共顶点)中的棋子,最终达到目标状态.要求第i行第j列的格子只能参与mi,j次交换. 输入输出格式 输入格式: 第一行 ...
- [luoguP3159] [CQOI2012]交换棋子(最小费用最大流)
传送门 好难的网络流啊,建图真的超难. 如果不告诉我是网络流的话,我估计就会写dfs了. 使用费用流解决本题,设点 $p[i][j]$ 的参与交换的次数上限为 $v[i][j]$ ,以下为建图方式: ...
随机推荐
- 绝对干货!初学者也能看懂的DPDK解析
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由Willko发表于云+社区专栏 一.网络IO的处境和趋势 从我们用户的使用就可以感受到网速一直在提升,而网络技术的发展也从1GE/10 ...
- 基础的 sparkSQL操作
spark连接mysql操作 数据库jdbc 连接封装 package test.com import org.apache.spark.sql.{DataFrame, SparkSession} / ...
- 金融科技行业 SDL(转载)
都是一些检查项,值得借鉴,关键在于要能够落地 作者 沈发挺@美的金融科技下载打印版
- java并发编程原理
一.java内存模型 Java内存模型的主要目标是定义程序中各个变量的访问规则,即在虚拟机中将变量存储到内存和从内存中取出变量这样底层细节.此处的变量与Java编程时所说的变量不一样,指包括了实例字段 ...
- python操作hive并且获取查询结果scheam
执行hive -e 命令并且获取对应的select查询出来的值及其对应的scheam字段 需要在执行语句中前部添加 set hive.cli.print.header=true; 这个设置,如下语句: ...
- iOS 静态库生成(引用第三方SDK、开源库、资源包)
一.静态库创建 打开Xcode, 选择File ----> New ---> Project 选择iOS ----> Framework & Library ---> ...
- 第24次Scrum会议(11/12)【欢迎来怼】
一.小组信息 队名:欢迎来怼 小组成员 队长:田继平 成员:李圆圆,葛美义,王伟东,姜珊,邵朔,阚博文 小组照片 二.开会信息 时间:2017/11/12 17:05~17:32,总计27min. 地 ...
- TeamWork#3,Week5,Scrum Meeting 11.9
由于经验不足和储备知识不够,最近我们的项目遇到了一些技术问题,需要对项目进行重新计划.我们总结了经验教训,找出了问题所在,明确了要补充的知识,加紧学习,将会在一周之内解决相关问题. 成员 已完成 待完 ...
- pycharm 打开两个项目
1.之前用打开文件,选择一直选不到整个项目,打开也都是在已经打开的项目窗口中加载一个文件. 2.网上有介绍说设置,但是自己的pycharm经过中文汉化,许多设置项已消失不见... 3.最近打开,直接操 ...
- Runtime 类的使用
package com.System.Runtime; import java.io.IOException; /* RunTime 该类类主要代表了应用程序运行的环境. getRuntime() 返 ...