题目: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. 深入浅出Attribute (一)

    正文: 什么是Attribute?Attribute是干什么使的?Attribute与Property到底有什么区别?…… 长久以来,这些问题一直困扰着并不怎么广大的C#初学者.原因大概有两个,一是A ...

  2. php信号处理

    pcntl pcntl_signal 信号注册函数 pcntl_alarm 指定秒数中断程序执行任务. 每次执行只会有一个定时器生效,若之前计时器还没结束就定义新定时器,会替代之前定时器并返回之前定时 ...

  3. 【BZOJ4166】月宫的符卡序列 Manacher+hash

    [BZOJ4166]月宫的符卡序列 题解:题倒不难,就是有点恶心. 首先学习回文串的时候一定学到了这样一个结论:一个长度为n的串的本质不同的回文子串数量不超过n个. 那么我们就可以试图将所有回文串的价 ...

  4. 【BZOJ4568】[Scoi2016]幸运数字 倍增+线性基

    [BZOJ4568][Scoi2016]幸运数字 Description A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有一个幸运数字,以纪念 ...

  5. EasyPlayerPro(Windows)流媒体播放器开发之跨语言调用

    下面我们来讲解一下关于EasyPlayerPro接口的调用,主要分为C++和C#两种语言,C++也可以基于VC和QT进行开发,C++以VC MFC框架为例进行讲解,C#以Winform框架为例进行讲解 ...

  6. C#操作XML方法:新增、修改和删除节点与属性

    一 前言 先来了解下操作XML所涉及到的几个类及之间的关系  如果大家发现少写了一些常用的方法,麻烦在评论中指出,我一定会补上的!谢谢大家 * 1 XMLElement 主要是针对节点的一些属性进行操 ...

  7. 九度OJ 1166:迭代求立方根 (迭代)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:3695 解决:1700 题目描述: 立方根的逼近迭代方程是 y(n+1) = y(n)*2/3 + x/(3*y(n)*y(n)),其中y0 ...

  8. 九度OJ 1147:Jugs(罐子) (模拟、游戏)

    时间限制:1 秒 内存限制:32 兆 特殊判题:是 提交:243 解决:200 题目描述: In the movie "Die Hard 3", Bruce Willis and ...

  9. 10分钟看懂, Java NIO 底层原理

    目录 写在前面 1.1. Java IO读写原理 1.1.1. 内核缓冲与进程缓冲区 1.1.2. java IO读写的底层流程 1.2. 四种主要的IO模型 1.3. 同步阻塞IO(Blocking ...

  10. 3款Linux网络监视工具

    1 iftop: 如果你想看到现在你的带宽到底是哪些应用在使用,并且各个应用占据了多少带宽的时候,可以用iftop显示出来.使用的参数如下: -h                  display t ...