【Luogu】P3159交换棋子(超出我能力范围的费用流)
明显超出我能力范围。
只放题解。
再放代码。
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<cstdlib>
#include<cctype>
#include<queue>
#define maxn 100200
using namespace std;
inline long long read(){
long long num=,f=;
char ch=getchar();
while(!isdigit(ch)){
if(ch=='-') f=-;
ch=getchar();
}
while(isdigit(ch)){
num=num*+ch-'';
ch=getchar();
}
return num*f;
} int n,m;
inline int calc(int x,int y,int z){ return (x-)*m+y+(z-)*(n*m); }
inline int count(int i){ return i&?i+:i-; }
struct Edge{
int from,next,to,dis,val,flow;
}edge[maxn];
int head[maxn],num;
inline void addedge(int from,int to,int dis,int val){
edge[++num]=(Edge){from,head[from],to,dis,val,};
head[from]=num;
}
inline void add(int from,int to,int dis,int val){
addedge(from,to,dis,val);
addedge(to,from,-dis,);
} bool sta[][];
bool edn[][];
int swa[][];
int Start,End; int u[]={,,,,,,-,-,-};
int w[]={,,,,-,-,-,,}; struct Ans{
long long dis,val;
Ans(){dis=val=;}
}; long long dis[maxn];
long long pre[maxn];
int flow[maxn];
bool vis[maxn];
int sum; Ans spfa(){
Ans ans;
memset(dis,/,sizeof(dis)); long long Max=dis[];
dis[Start]=; flow[Start]=0x7fffffff;
queue<int>q; q.push(Start);
while(!q.empty()){
int from=q.front();q.pop();vis[from]=;
for(int i=head[from];i;i=edge[i].next){
int to=edge[i].to;
if(edge[i].dis+dis[from]>=dis[to]||edge[i].val==edge[i].flow) continue;
dis[to]=dis[from]+edge[i].dis;
pre[to]=i;
flow[to]=min(flow[from],edge[i].val-edge[i].flow);
if(!vis[to]){
vis[to]=;
q.push(to);
}
}
}
if(dis[End]==Max) return ans;
long long now=End; ans.val=flow[End]; ans.dis=dis[End];
sum+=flow[End];
while(now!=Start){
long long ret=pre[now];
edge[ret].flow+=flow[End];
edge[count(ret)].flow-=flow[End];
now=edge[ret].from;
}
return ans;
} int main(){
n=read(),m=read();
End=calc(n,m,)+;
for(int i=;i<=n;++i){
char ch[];
scanf("%s",ch+);
for(int j=;j<=m;++j) sta[i][j]=ch[j]-'';
}
for(int i=;i<=n;++i){
char ch[];
scanf("%s",ch+);
for(int j=;j<=m;++j) edn[i][j]=ch[j]-'';
}
for(int i=;i<=n;++i){
char ch[];
scanf("%s",ch+);
for(int j=;j<=m;++j) swa[i][j]=ch[j]-'';
}
int sum1=,sum2=;
for(int i=;i<=n;++i)
for(int j=;j<=m;++j){
if(sta[i][j]){
sum1++;
add(Start,calc(i,j,),,);
}
if(edn[i][j]){
sum2++;
add(calc(i,j,),End,,);
}
if(sta[i][j]&&(!edn[i][j])){
add(calc(i,j,),calc(i,j,),,swa[i][j]>>);
add(calc(i,j,),calc(i,j,),,(swa[i][j]+)>>);
}
if((!sta[i][j])&&edn[i][j]){
add(calc(i,j,),calc(i,j,),,(swa[i][j]+)>>);
add(calc(i,j,),calc(i,j,),,swa[i][j]>>);
}
if(sta[i][j]==edn[i][j]){
add(calc(i,j,),calc(i,j,),,swa[i][j]>>);
add(calc(i,j,),calc(i,j,),,swa[i][j]>>);
}
for(int k=;k<;++k){
int x=i+u[k];int y=j+w[k];
if(x<||x>n||y<||y>m) continue;
add(calc(i,j,),calc(x,y,),,0x7fffffff);
}
}
if(sum1!=sum2){
printf("-1");
return ;
}
int ans=;
while(){
Ans now=spfa();
if(!now.val) break;
ans+=now.val*now.dis;
}
if(sum!=sum1){
printf("-1");
return ;
}
printf("%d",ans);
return ;
}
https://www.luogu.org/problemnew/solution/P3159
【Luogu】P3159交换棋子(超出我能力范围的费用流)的更多相关文章
- 洛谷P3159 交换棋子 神奇的网络流
神奇的建模...原题链接 如果你真的把交换看成交换,就\(GG\)了.首先我们要把交换看成是白棋的移动. 然后,很容易的就想到建模的大致思路:建立超级源点S和超级汇点T,从S向初始局面每个白棋所在的格 ...
- 洛谷 P3159(BZOJ 2668)[CQOI2012]交换棋子
有一个\(n\)行\(m\)列的黑白棋盘,你每次可以交换两个相邻格子(相邻是指有公共边或公共顶点)中的棋子,最终达到目标状态.要求第\(i\)行第\(j\)列的格子只能参与\(m[i][j]\)次交换 ...
- P3159 [CQOI2012]交换棋子
思路 相当神奇的费用流拆点模型 最开始我想到把交换黑色棋子看成一个流流动的过程,流从一个节点流向另一个节点就是交换两个节点,然后把一个位置拆成两个点限制流量,然后就有了这样的建图方法 S向所有初始是黑 ...
- 【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 ...
- 【BZOJ2668】[cqoi2012]交换棋子 费用流
[BZOJ2668][cqoi2012]交换棋子 Description 有一个n行m列的黑白棋盘,你每次可以交换两个相邻格子(相邻是指有公共边或公共顶点)中的棋子,最终达到目标状态.要求第i行第j列 ...
- BZOJ2668:[CQOI2012]交换棋子(费用流)
题目描述 有一个n行m列的黑白棋盘,你每次可以交换两个相邻格子(相邻是指有公共边或公共顶点)中的棋子,最终达到目标状态.要求第i行第j列的格子只能参与mi,j次交换. 输入输出格式 输入格式: 第一行 ...
- [cqoi2012]交换棋子
2668: [cqoi2012]交换棋子 Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 1334 Solved: 518[Submit][Stat ...
随机推荐
- UI与数据分离 与 UI的演进
解藕的好处:UI内部模块能够灵活的变化. MVC或者三层架构着重强调了数据.业务逻辑和UI的分离. (MVC中的C只是UI和业务逻辑模块间的一个中转组件,理论上应该是个轻模块.) 以前的关注的解藕技术 ...
- AMD、CMD规范
本文原链接:https://cloud.tencent.com/developer/article/1177217 AMD && CMD 前言 一.模块 二.CommonJS 三.AM ...
- 2018.3.5 Java语言基础与面向对象编程实践
Java语言基础与面向对象编程实践 第一章 初识Java 1.Java特点 http://www.manew.com/blog-166576-20164.html Java语言面向对象的 Java语言 ...
- Python——序列封包与序列解包
一.序列封包与序列解包 把多个值赋给一个变量时,Python会自动的把多个值封装成元组,称为序列封包. 把一个序列(列表.元组.字符串等)直接赋给多个变量,此时会把序列中的各个元素依次赋值给每个变量, ...
- C#动态数组ArrayList
在C#中,如果需要数组的长度和元素的个数随着程序的运行不断改变,就可以使用ArrayList类,该类是一个可以动态增减成员的数组. 一.ArrayList类的常用属性和方法 1. ArrayList类 ...
- spring IOC注解与xml配置
转载自:https://blog.csdn.net/u014292162/article/details/52277756 IOC 1小案例 将对象的依赖交给配置文件来配置(配置文件的名字是可以任意的 ...
- 如何使用jmeter做关联
1.适用场景 从上一个接口的返回值中获取值传递给下一个接口使用 2.添加JSON Extractor 在需求提取的参数上添加--后置处理器--JSON Extractor 从登录接口的返回值中取use ...
- ccf 201712-4 行车路线(Python实现)
一.原题 问题描述 试题编号: 201712-4 试题名称: 行车路线 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 小明和小芳出去乡村玩,小明负责开车,小芳来导航. 小芳将 ...
- 解决linux不能解压rar格式压缩包
1download rarlinux-x64-5.3.0.tar.gz data package 2.tar xvf rarlinux-64-5.3.0.tar.gz 3. cd rar and th ...
- 经典MSSQL语句大全和常用SQL语句命令的作用
下列语句部分是Mssql语句,不可以在access中使用. SQL分类: DDL类型包括数据库.表的创建,修改,删除,声明—数据定义语言(CREATE,ALTER,DROP,DECLARE) DML类 ...