poj3422K方格取数——最大费用最大流
题目: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方格取数——最大费用最大流的更多相关文章
- Codevs 1227 方格取数 2(费用流)
1227 方格取数 2 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 查看运行结果 题目描述 Description 给出一个n*n的矩阵,每一格有一个非负整数 ...
- P2774 方格取数问题 网络最大流 割
P2774 方格取数问题:https://www.luogu.org/problemnew/show/P2774 题意: 给定一个矩阵,取出不相邻的数字,使得数字的和最大. 思路: 可以把方格分成两个 ...
- 洛谷P2045 方格取数加强版(费用流)
题意 题目链接 Sol 这题能想到费用流就不难做了 从S向(1, 1)连费用为0,流量为K的边 从(n, n)向T连费用为0,流量为K的边 对于每个点我们可以拆点限流,同时为了保证每个点只被经过一次, ...
- LG2045 方格取数加强版 费用流
问题描述 LG2045 题解 费用流. 套路拆点,把\((i,j)\)拆为两个点,在这两个点之间连边:一条边流量为\(1\),费用为\(a_{i,j}\),另一条边为流量为\(INF\),费用为\(0 ...
- 【wikioi】1907 方格取数3(最大流+最大权闭合子图)
http://www.wikioi.com/problem/1907/ 这题我一开始想到的是状压,看到n<=30果断放弃. 然后也想到了黑白染色,然后脑残了,没想到怎么连边. 很简单的一题 黑白 ...
- 「网络流24题」「LuoguP2774」方格取数问题(最大流 最小割
Description 在一个有 m*n 个方格的棋盘中,每个方格中有一个正整数.现要从方格中取数,使任意 2 个数所在方格没有公共边,且取出的数的总和最大.试设计一个满足要求的取数算法.对于给定的方 ...
- 洛谷 - P2045 - 方格取数加强版 - 费用流
原来这种题的解法是费用流. 从一个方格的左上走到右下,最多走k次,每个数最多拿走一次. 每次走动的流量设为1,起始点拆点成限制流量k. 每个点拆成两条路,一条路限制流量1,费用为价值相反数.另一条路无 ...
- HDU 1565&1569 方格取数系列(状压DP或者最大流)
方格取数(2) Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...
- LibreOJ #6007. 「网络流 24 题」方格取数 最小割 最大点权独立集 最大流
#6007. 「网络流 24 题」方格取数 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据 题目描述 ...
随机推荐
- Linux下比较常用的svn命令
svn: command not found yum install -y subversion 以下是一些常用命令的使用方法,希望对大家有所帮助. 1,check out(co)签出代码 test. ...
- PowerBuilder -- Len(), LenA() 与 String, Blob
使用的是Powerbuilder12.5与Powerbuild9 不太一样 函数 String Blob Len() 返回字符数 返回字符数对应的字节数 LenA() 返回字节数 返回字符数对应的字节 ...
- JAVA学习第五十二课 — IO流(六)File对象
File类 用来给文件或者目录封装成对象 方便对文件与目录的属性信息进行操作 File对象能够作为參数传递给流的构造函数 一.构造函数和分隔符 public static void FileDemo( ...
- Android-解决Fail to post notification on channel "null"的方法
原文:https://blog.csdn.net/weixin_40604111/article/details/78674563 在sdk版本为25或25之前想在notification中添加一个点 ...
- 九度OJ 1037:Powerful Calculator(强大的计算器) (大整数运算)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:1821 解决:528 题目描述: Today, facing the rapid development of business, SJTU ...
- 九度OJ 1015:还是A+B (基础题)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:6773 解决:4031 题目描述: 读入两个小于10000的正整数A和B,计算A+B.需要注意的是:如果A和B的末尾K(不超过8)位数字相同 ...
- [TroubleShooting]Neither the partner nor the witness server instance for database is availble
Problem: You are trying to setup a mirroring on a Database called xxxDB(SQL server 2012). You are ge ...
- <raspberry pi > 用树莓派来听落网电台
树莓派放在抽屉里吃灰有半年多了,去年玩了1个月后就没怎么开整了,上个月没工作,刚好有点闲暇,就把树莓派翻出来折腾,刚好碰到落网改版了,想起以前在树莓派论坛看到有网友拿树莓派来听豆瓣电台,代码那时我都下 ...
- history显示历史操作记录,并显示操作时间
在查看历史的操作记录有两种方式1.在用户的目录下的.bash_history文件中[root@node1 ~]# vi ~/.bash_history rebootvi /etc/sysconfig/ ...
- zabbix监控系统性能采集指标
监控项目 详细内容 ...