题解:

可以戳这里:http://www.cnblogs.com/zig-zag/archive/2013/04/21/3033485.html

其实自己yy一下就知道这样建图的正确性了。

感觉太神奇,居然还能拆成3个点

orzzzzzzzzzzzzzzzzzzzzzzzzz

跪跪跪跪跪跪跪跪

代码:

 #include<cstdio>

 #include<cstdlib>

 #include<cmath>

 #include<cstring>

 #include<algorithm>

 #include<iostream>

 #include<vector>

 #include<map>

 #include<set>

 #include<queue>

 #include<string>

 #define inf 1000000000

 #define maxn 200000+5

 #define maxm 200000+5

 #define eps 1e-10

 #define ll long long

 #define pa pair<int,int>

 #define for0(i,n) for(int i=0;i<=(n);i++)

 #define for1(i,n) for(int i=1;i<=(n);i++)

 #define for2(i,x,y) for(int i=(x);i<=(y);i++)

 #define for3(i,x,y) for(int i=(x);i>=(y);i--)

 #define for4(i,x) for(int i=head[x],y;i;i=e[i].next)

 #define mod 1000000007

 using namespace std;

 inline int read()

 {

     int x=,f=;char ch=getchar();

     while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}

     while(ch>=''&&ch<=''){x=*x+ch-'';ch=getchar();}

     return x*f;

 }
int n,m,k,mincost,tot,s,t,head[maxn],d[maxn],from[*maxm];
bool v[maxn];
queue<int>q;
int a[][][],num[][][],cnt[];
struct edge{int from,go,next,v,c;}e[*maxm];
void add(int x,int y,int v,int c)
{
e[++tot]=(edge){x,y,head[x],v,c};head[x]=tot;
e[++tot]=(edge){y,x,head[y],,-c};head[y]=tot;
}
bool spfa()
{
for (int i=s;i<=t;i++){v[i]=;d[i]=inf;}
q.push(s);d[s]=;v[s]=;
while(!q.empty())
{
int x=q.front();q.pop();v[x]=;
for (int i=head[x],y;i;i=e[i].next)
if(e[i].v&&d[x]+e[i].c<d[y=e[i].go])
{
d[y]=d[x]+e[i].c;from[y]=i;
if(!v[y]){v[y]=;q.push(y);}
}
}
return d[t]!=inf;
}
void mcf()
{
mincost=;
while(spfa())
{
int tmp=inf;
for(int i=from[t];i;i=from[e[i].from]) tmp=min(tmp,e[i].v);
mincost+=d[t]*tmp;
for(int i=from[t];i;i=from[e[i].from]){e[i].v-=tmp;e[i^].v+=tmp;}
}
}
const int dx[]={,,,-,,,-,-};
const int dy[]={,-,,,-,,,-}; int main() {
n=read();m=read();s=;t=*n*m+;
for0(k,)for1(i,n)for1(j,m)
{
char ch=getchar();
while(ch<''||ch>'')ch=getchar();
a[i][j][k]=ch-'';
//cout<<i<<' '<<j<<' '<<k<<' '<<a[i][j][k]<<endl;
num[i][j][k]=++tot;
cnt[k]+=a[i][j][k];
}
//cout<<tot<<' '<<s<<' '<<t<<endl;
tot=;
for1(i,n)for1(j,m)
{
if(a[i][j][]&&a[i][j][])a[i][j][]=a[i][j][]=;
if(a[i][j][])
{
add(num[i][j][],num[i][j][],a[i][j][]/,);
add(num[i][j][],num[i][j][],(a[i][j][]+)/,);
add(s,num[i][j][],,);
}
else if(a[i][j][])
{
add(num[i][j][],num[i][j][],(a[i][j][]+)/,);
add(num[i][j][],num[i][j][],a[i][j][]/,);
add(num[i][j][],t,,);
}
else
{
add(num[i][j][],num[i][j][],a[i][j][]/,);
add(num[i][j][],num[i][j][],a[i][j][]/,);
}
for0(k,)
{
int x=i+dx[k],y=j+dy[k];
if(x<||x>n||y<||y>m)continue;
add(num[i][j][],num[x][y][],inf,);
}
}
if(cnt[]!=cnt[]){printf("-1\n");return ;}
mcf();
printf("%d\n",mincost); return ; }

2668: [cqoi2012]交换棋子

Time Limit: 3 Sec  Memory Limit: 128 MB
Submit: 673  Solved: 235
[Submit][Status]

Description

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

Input

第一行包含两个整数nm(1<=n, m<=20)。以下n行为初始状态,每行为一个包含m个字符的01串,其中0表示黑色棋子,1表示白色棋子。以下n行为目标状态,格式同初始状态。以下n行每行为一个包含m个0~9数字的字符串,表示每个格子参与交换的次数上限。
 

Output

输出仅一行,为最小交换总次数。如果无解,输出-1。

Sample Input

3 3
110
000
001
000
110
100
222
222
222

Sample Output

4

BZOJ2668: [cqoi2012]交换棋子的更多相关文章

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

    题目链接 BZOJ2668 题解 容易想到由\(S\)向初始的黑点连边,由终态的黑点向\(T\)连边,然后相邻的点间连边 但是这样满足不了交换次数的限制,也无法计算答案 考虑如何满足一个点的交换次数限 ...

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

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

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

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

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

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

  5. 【BZOJ-2668】交换棋子 最小费用最大流

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

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

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

  7. [cqoi2012]交换棋子

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

  8. BZOJ2668:[CQOI2012]交换棋子——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=2668 https://www.luogu.org/problemnew/show/P3159#sub ...

  9. [bzoj2668] [洛谷P3159] [cqoi2012] 交换棋子

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

随机推荐

  1. Kakfa揭秘 Day6 Consumer源码解密

    Kakfa揭秘 Day6 Consumer源码解密 今天主要分析下Consumer是怎么来工作的,今天主要是例子出发,对整个过程进行刨析. 简单例子 Example中Consumer.java是一个简 ...

  2. Linux tar 解压缩命令

    tar -c: 建立压缩档案 -x:解压 -t:查看内容 -r:向压缩归档文件末尾追加文件 -u:更新原压缩包中的文件 这五个是独立的命令,压缩解压都要用到其中一个,可以和别的命令连用但只能用其中一个 ...

  3. 使用bootstrap+asp.net mvc4+IBatis.Net实现的小程序

    这个项目用到了三个技术点 1.bootstap 3.0 2.asp.net mvc4 3.IBatis.Net 这个三个技术点分别解决前端界面展示.中间mvc路由控制.实体框架映射数据访问 重点分页问 ...

  4. Inside of Jemalloc

    INSIDE OF JEMALLOCThe Algorithm and Implementation of Jemalloc author: vector03mail:   mmzsmm@163.co ...

  5. 【CSS】盒模型+选择器(你选择的要操作的对象)

    盒模型 转http://www.cnblogs.com/cchyao/archive/2010/07/12/1775846.html 1.w3c标准的盒模型和ie的盒模型主要差别在于content的w ...

  6. custom activities

    Useful Sharepoint Designer Custom Workflow Activities http://spdactivities.codeplex.com/ http://stac ...

  7. I/O 流---输出流

    输出流(写入数据) a. 字节输出流 OutputStram 输出流的父类 FileOutputStream:  继承OutputStream 方法: OutputStream os=new File ...

  8. Svg 画图(电池)

    公司现在在做充电桩项目,其中要显示充电桩的电池充电情况,功能展示的时候要画图,之前做的时候准备使用HightChar来画,但是,hightchar好像没有这样的电池图形,最后,项目经理要我自己通过sv ...

  9. Telerik RadGridView 右键菜单如何设置?

    问题: 我想去掉红线框住的部分,希望有会的网友帮助我,谢谢! 解决方法: 默认: 修改: [利用 ContextMenuOpening 事件,对应你的项目,你要自己修改那判断的字符串(你的中文)] p ...

  10. mybatis 的<![CDATA[ ]]>

    示例: xml文件: <!-- 获取条数 --> <select id="getCount" parameterType="Map" resu ...