Link:

BZOJ 2668 传送门

Solution:

重点在于对于每条转移路径:首尾算一次,中间节点算两次

可以一点拆三点,将原流量拆成入流量和出流量

但其实也可以就拆两点,分前后是否是一首尾点一普通点来确定是否有一条路径只占用1流量

Code:

#include <bits/stdc++.h>

using namespace std;
#define X first
#define Y second
typedef long long ll;
typedef pair<int,int> P;
const int MAXN=1e5+,INF=<<;
int n,m,cnt1,cnt2;char dat[][][],lmt[][]; namespace mcmf
{
struct edge
{int to,cap,cost,rev;};
vector<edge> a[MAXN];
int S,T,h[MAXN],dist[MAXN],preV[MAXN],preE[MAXN],maxf,minc; void add_edge(int from,int to,int cap,int cost)
{
a[from].push_back(edge{to,cap,cost,a[to].size()});
a[to].push_back(edge{from,,-cost,a[from].size()-});
}
void min_cost_flow(int f)
{
while(f>)
{
priority_queue<P,vector<P>,greater<P> > que;
fill(dist,dist+T+,INF);
dist[S]=;que.push(P(,S));
while(!que.empty())
{
P t=que.top();que.pop();
int v=t.Y;if(dist[v]<t.X) continue; for(int i=;i<a[v].size();i++)
{
edge &e=a[v][i];
if(e.cap>&&dist[e.to]>dist[v]+e.cost+h[v]-h[e.to])
dist[e.to]=dist[v]+e.cost+h[v]-h[e.to],
preV[e.to]=v,preE[e.to]=i,que.push(P(dist[e.to],e.to));
}
}
if(dist[T]==INF) break;
for(int i=;i<=T;i++) h[i]+=dist[i]; int d=f;
for(int i=T;i!=S;i=preV[i])
d=min(d,a[preV[i]][preE[i]].cap);
f-=d;minc+=d*h[T];maxf+=d;
for(int i=T;i!=S;i=preV[i])
{
edge &e=a[preV[i]][preE[i]];
e.cap-=d,a[i][e.rev].cap+=d;
}
}
}
}
using namespace mcmf;
int dx[]={,,,-,-,-,,};
int dy[]={,-,,,-,,,-};
int idx(int x,int y,int z){return (x-)*m+y+n*m*z;} int main()
{
scanf("%d%d",&n,&m);
S=;T=*n*m+;
for(int i=;i<=n;i++) scanf("%s",dat[][i]+);
for(int i=;i<=n;i++) scanf("%s",dat[][i]+);
for(int i=;i<=n;i++) scanf("%s",lmt[i]+);
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
{
if(dat[][i][j]=='')
cnt1++,add_edge(S,idx(i,j,),,);
if(dat[][i][j]=='')
cnt2++,add_edge(idx(i,j,),T,,);
if(dat[][i][j]==dat[][i][j])
add_edge(idx(i,j,),idx(i,j,),(lmt[i][j]-'')/+dat[][i][j]-'',);
else add_edge(idx(i,j,),idx(i,j,),(lmt[i][j]-''+)/,); for(int k=;k<;k++)
{
int fx=i+dx[k],fy=j+dy[k];
if(fx<||fx>n||fy<||fy>m) continue;
add_edge(idx(i,j,),idx(fx,fy,),INF,);
}
} min_cost_flow(INF);
if(cnt1!=cnt2||maxf!=cnt1) puts("-1");
else printf("%d",minc);
return ;
}

[BZOJ 2668] 交换棋子的更多相关文章

  1. BZOJ 2668 交换棋子(费用流)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2668 题意:有一个n行m列的黑白棋盘,你每次可以交换两个相邻格子中的棋子,最终达到目标状 ...

  2. 【BZOJ】【2668】【CQOI2012】交换棋子

    网络流/费用流 跪跪跪,居然还可以这样建图…… 题解:http://www.cnblogs.com/zig-zag/archive/2013/04/21/3033485.html 考虑每个点的交换限制 ...

  3. BZOJ 2668 [cqoi2012]交换棋子 | 最小费用最大流

    传送门 BZOJ 2668 题解 同时分别限制流入和流出次数,所以把一个点拆成三个:入点in(x).中间点mi(x).出点ou(x). 如果一个格子x在初始状态是黑点,则连(S, mi(x), 1, ...

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

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

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

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

  6. BZOJ2668: [cqoi2012]交换棋子

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

  7. [cqoi2012]交换棋子

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

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

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

  9. [BZOJ 4563]放棋子

    [BZOJ 4563]放棋子 题目 给你一个N*N的矩阵,每行有一个障碍,数据保证任意两个障碍不在同一行,任意两个障碍不在同一列,要求你在这个矩阵上放N枚棋子(障碍的位置不能放棋子),要求你放N个棋子 ...

随机推荐

  1. Java 对象排序详解

    很难想象有Java开发人员不曾使用过Collection框架.在Collection框架中,主要使用的类是来自List接口中的ArrayList,以及来自Set接口的HashSet.TreeSet,我 ...

  2. Centos 6.5下安装vsftpd服务器

    1.查看是否安装vsftp  [root@localhost ~]#rpm -qa|grep vsftpd 如果出现 vsftpd-2.2.2-13.el6_6.1.x86_64  则说明已经安装了v ...

  3. bzoj 1261 区间DP

    首先我们知道ans=Σ(h[i]*f[i])=Σ(h[i]*d[i])/s=Σ(k(r[i]+1)+c)*d[i]/s=Σ(k*r[i]+(k+c))*d[i]/s 我们可以发现,除了k*r[i]之外 ...

  4. Bower A package manager for the web

    Bower can manage components that contain HTML, CSS, JavaScript, fonts or even image files. Bower doe ...

  5. oracle 的number数据类型

    NUMBER类型细讲:Oracle number datatype 语法:NUMBER[(precision [, scale])]简称:precision --> p      scale   ...

  6. 解决不走onActivityResult方法

    最近在开发公司项目,在使用startActivityForResult关联俩个Activity中,发现A跳转到B,B设置setResult之后,A没有执行onActivityResult,查找一下,发 ...

  7. 基于Django Form源码开发自定义Form组件

    import copy import re class ValidateError(Exception): def __init__(self, detail): self.detail = deta ...

  8. Perl中文件读取操作

    Perl中文件读取操作 http://blog.csdn.net/yangxuan12580/article/details/51506216

  9. JDBC数据源连接池(3)---Tomcat集成DBCP

    此文续<JDBC数据源连接池(2)---C3P0>. Apache Tomcat作为一款JavaWeb服务器,内置了DBCP数据源连接池.在使用中,只要进行相应配置即可. 首先,确保Web ...

  10. .vue,跟小程序文件在sublime里面怎么实现代码格式化

    .vue文件跟小程序的.wxml,.wxss用sublime的HTML/CSS/JS prettify插件也可以实现格式化代码的效果 首先你在sublime要已经安装好了HTML/CSS/JS pre ...