题目:http://poj.org/problem?id=3422

最大费用最大流:

拆点,在自点之间连两条边,一条容量为1,边权为数字;一条容量为k-1,边权为0;表示可以走k次,只有一次能取到数字;

从每个格子能向下或向右走,于是向下面的点、右面的点连边;

将E-K算法中的bfs改成spfa求最长路(边权最大),找出最大流即为答案;

因为对E-K算法不太熟练,WA了n遍,最后发现是不能像dinic一样在bfs中途找到汇点就退出,因为不是构建分层图,而是spfa求最长路。

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
queue<int>q;
int n,k,ans,head[],ct=,s,t,inf=1e9,dis[],pre[],incf[];
bool vis[];
struct N{
int to,next,w,v;
N(int t=,int n=,int ww=,int vv=):to(t),next(n),w(ww),v(vv) {}
}edge[];
void add(int x,int y,int ww,int vv)
{
edge[++ct]=N(y,head[x],ww,vv);head[x]=ct;
edge[++ct]=N(x,head[y],,-vv);head[y]=ct;
}
bool bfs()
{
memset(vis,,sizeof vis);
memset(pre,,sizeof pre);
memset(dis,-,sizeof dis);
memset(incf,,sizeof incf);
while(q.size())q.pop();
q.push(s);vis[s]=;dis[s]=;
while(q.size())
{
int x=q.front();q.pop();vis[x]=;
for(int i=head[x];i;i=edge[i].next)
{
int u=edge[i].to;
// if(vis[u])continue;
if(edge[i].w&&dis[u]<dis[x]+edge[i].v)//残量网络spfa
{
dis[u]=dis[x]+edge[i].v;
incf[u]=min(edge[i].w,incf[x]);
pre[u]=i;
if(!vis[u])q.push(u),vis[u]=;
// if(u==t)return 1;//!!!
}
}
}
if(dis[t]<)return ;
else return ;
// return 0;
}
void up()
{
int x=t;
while(x!=s)
{
int i=pre[x];
edge[i].w-=incf[t];
edge[i^].w+=incf[t];
ans+=edge[i].v*incf[t];//
x=edge[i^].to;
}
// ans+=dis[t]*incf[t];// 皆可
}
int main()
{
scanf("%d%d",&n,&k);
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
{
int x,p=(i-)*n+j,p2=p+n*n;
scanf("%d",&x);
add(p,p2,,x);
add(p,p2,k-,);//
if(i<n)add(p2,p+n,k,);
if(j<n)add(p2,p+,k,);
}
s=;t=*n*n+;
add(s,,k,);
add(*n*n,t,k,);
while(bfs())up();
printf("%d",ans);
return ;
}

附数据:


数据

poj3422K方格取数——最大费用最大流的更多相关文章

  1. Codevs 1227 方格取数 2(费用流)

    1227 方格取数 2 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 查看运行结果 题目描述 Description 给出一个n*n的矩阵,每一格有一个非负整数 ...

  2. P2774 方格取数问题 网络最大流 割

    P2774 方格取数问题:https://www.luogu.org/problemnew/show/P2774 题意: 给定一个矩阵,取出不相邻的数字,使得数字的和最大. 思路: 可以把方格分成两个 ...

  3. 洛谷P2045 方格取数加强版(费用流)

    题意 题目链接 Sol 这题能想到费用流就不难做了 从S向(1, 1)连费用为0,流量为K的边 从(n, n)向T连费用为0,流量为K的边 对于每个点我们可以拆点限流,同时为了保证每个点只被经过一次, ...

  4. LG2045 方格取数加强版 费用流

    问题描述 LG2045 题解 费用流. 套路拆点,把\((i,j)\)拆为两个点,在这两个点之间连边:一条边流量为\(1\),费用为\(a_{i,j}\),另一条边为流量为\(INF\),费用为\(0 ...

  5. 【wikioi】1907 方格取数3(最大流+最大权闭合子图)

    http://www.wikioi.com/problem/1907/ 这题我一开始想到的是状压,看到n<=30果断放弃. 然后也想到了黑白染色,然后脑残了,没想到怎么连边. 很简单的一题 黑白 ...

  6. 「网络流24题」「LuoguP2774」方格取数问题(最大流 最小割

    Description 在一个有 m*n 个方格的棋盘中,每个方格中有一个正整数.现要从方格中取数,使任意 2 个数所在方格没有公共边,且取出的数的总和最大.试设计一个满足要求的取数算法.对于给定的方 ...

  7. 洛谷 - P2045 - 方格取数加强版 - 费用流

    原来这种题的解法是费用流. 从一个方格的左上走到右下,最多走k次,每个数最多拿走一次. 每次走动的流量设为1,起始点拆点成限制流量k. 每个点拆成两条路,一条路限制流量1,费用为价值相反数.另一条路无 ...

  8. HDU 1565&1569 方格取数系列(状压DP或者最大流)

    方格取数(2) Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total S ...

  9. LibreOJ #6007. 「网络流 24 题」方格取数 最小割 最大点权独立集 最大流

    #6007. 「网络流 24 题」方格取数 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据   题目描述 ...

随机推荐

  1. easyNetq demo

    本demo包含一个类库,2个console程序 1.新建类库  MQHelper,控制台程序  consumer和proc ,控制台程序引用MQHelper 2.使用nuget安装easynwtq 和 ...

  2. Excel COM组件使用的注意事项和一些权限问题(转载)

    1.实例化Excel的COM组件的时候,不要直接调用类,要用Microsoft提供的接口 原来的写法:Excel.ApplicationClass excelApp = new Excel.Appli ...

  3. Uboot的串口下载文件命令:loads / loadb / loady

    1. loads loads [ off ] 通过串口,下载S-Rec文件到off位置 loads命令可以通过串口线下载S-Record格式文件. 2. loadb loadb [ off ] [ b ...

  4. 基于IAP和网口升级固件

    基于IAP和网口升级固件 一.      需求引入 现有嵌入式设备:基于ARM Cortex-M3处理器.带以太网通讯功能. 为减少设备维护成本节省宝贵的时间和金钱,须要设计网口升级固件功能. 本文描 ...

  5. cocos2dx 3.2+ 项目创建与问题总汇

    本文为Cocos2d-x 3.x 全平台(Android,iOS)新手开发配置教程攻略,希望对大家有所帮助.由于这篇文章是面对新手的. 所以有些地方会啰嗦一些,请勿见怪. 假设教程中有错误.欢迎指正. ...

  6. map和string的使用方法

    这个是别人写的map使用方法比較好能够看一下 http://www.cnblogs.com/anywei/archive/2011/10/27/2226830.html 怎样向数组中插入内容 http ...

  7. Tiny语言编译器简单介绍

    1.简单介绍:编译器是将一种语言翻译成还有一种语言的程序.编译器将源程序的代码作为输出,从而产生用目标语言编写的等价程序.比如源码为C/C++等高级语言,那么目标语言就是目标机器的机器代码.也就是能够 ...

  8. python 基础1.1--windows/linux 下安装python

    一.windows下安装python 1>windows上python后缀是.msi的,下载下来后,直接双击运行.会在c盘生成python.exe的文件,把python.exe的文件加入到win ...

  9. tp框架知识 之(链接数据库和操作数据内容)

    框架有时会用到数据库的内容,在"ThinkPhp框架知识"的那篇随笔中提到过,现在这篇随笔详细的描述下. 一.链接数据库 (1)找到模块文件夹中的Conf文件夹,然后进行编写con ...

  10. JS基础知识再整理..........不断更新中

    1.JS的五种基本数据类型:字符串.数值.布尔.null.underfined. 2.在JS中,字符串.数值.布尔三种数据类型,有其属性和方法: 3.字符串的三种常用方法[.indexof()..su ...