[CodeVs1227]方格取数2(最大费用最大流)
网络流24题的坑还没填完,真的要TJ?
题目大意:一个n*n的矩阵,每格有点权,从(1,1)出发,可以往右或者往下走,最后到达(n,n),每达到一格,把该格子的数取出来,该格子的数就变成0,这样一共走K次,现在要求K次所达到的方格的数的和最大。
啊简单的费用流。每个点i拆成i和i',连一条容量为1的边价值为点权,再连一条容量inf的边价值为0来让这个点能被经过,然后S连(1,1)容量k价值0,i'和右、下的点连容量inf价值0的边,(n,n)'连T容量inf价值0,跑最大费用最大流。
MDZZ看见n50我就开50,这是矩阵啊喂
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<queue>
using namespace std;
const int inf=,maxn=;
struct poi{int dis,pos;};
struct zs{int too,pre,c,cf,v,f;}e[];
priority_queue<poi>q;
bool operator <(poi a,poi b){return a.dis<b.dis;};
int n,k,z,tot,sum,ans;
int last[maxn],dist[maxn],pre[maxn];
bool v[maxn];
void read(int &k)
{
k=;int f=;char c=getchar();
while(c<''||c>'')c=='-'&&(f=-),c=getchar();
while(c<=''&&c>='')k=k*+c-'',c=getchar();
k*=f;
}
void add(int x,int y,int c,int v)
{
e[++tot].too=y;e[tot].c=e[tot].cf=c;e[tot].v=v;
e[tot].pre=last[x];last[x]=tot;
e[++tot].too=x;e[tot].v=-v;
e[tot].pre=last[y];last[y]=tot;
}
void spfa(int x)
{
for(int i=;i<=sum;i++)pre[i]=-,dist[i]=-inf,v[i]=;
dist[x]=;v[x]=;q.push((poi){,x});
while(!q.empty())
{
int now=q.top().pos;q.pop();
for(int i=last[now],too=e[i].too;i;i=e[i].pre,too=e[i].too)
if(e[i].cf)
if(dist[too]<dist[now]+e[i].v)
{
dist[too]=dist[now]+e[i].v;pre[too]=i;
if(!v[too])v[too]=,q.push((poi){dist[too],too});
}
v[now]=;
}
}
void ford(int s,int t)
{
spfa(s);
while(pre[t]!=-)
{
int mincf=inf;
for(int i=pre[t];i!=-;i=pre[e[i^].too])
mincf=min(mincf,e[i].cf);
ans+=dist[t]*mincf;
for(int i=pre[t];i!=-;i=pre[e[i^].too])
{
e[i].f+=mincf;e[i^].f=-e[i].f;
e[i].cf-=mincf;e[i^].cf+=mincf;
}
spfa(s);
}
}
int num(int x,int y){return (x-)*n+y;}
int main()
{
tot=;
read(n);read(k);sum=*n*n+;
add(,,k,);add(*n*n,sum,k,);
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
{
read(z);
add(num(i,j),num(i,j)+n*n,,z);
add(num(i,j),num(i,j)+n*n,inf,);
if(i!=n)add(num(i,j)+n*n,num(i+,j),inf,);
if(j!=n)add(num(i,j)+n*n,num(i,j+),inf,);
}
ford(,sum);
printf("%d\n",ans);
}
[CodeVs1227]方格取数2(最大费用最大流)的更多相关文章
- P2045 方格取数加强版 最大费用最大流
$ \color{#0066ff}{ 题目描述 }$ 给出一个n*n的矩阵,每一格有一个非负整数Aij,(Aij <= 1000)现在从(1,1)出发,可以往右或者往下走,最后到达(n,n),每 ...
- 【Codevs1227】方格取数2(费用流)
题意:给出一个n*n的矩阵,每一格有一个非负整数Aij,(Aij <= 1000) 现在从(1,1)出发,可以往右或者往下走,最后到达(n,n),每达到一格,把该格子的数取出来,该格子的数就变成 ...
- 【wikioi】1227 方格取数 2(费用流)
http://www.wikioi.com/problem/1227 裸题,拆点,容量为1,费用为点权的负数(代表只能取一次).再在拆好的两个点连边,容量为oo,费用为0.(代表能取0) 然后向右和下 ...
- 洛谷 P2045 方格取数加强版【费用流】
题目链接:https://www.luogu.org/problemnew/show/P2045 题目描述 给出一个n*n的矩阵,每一格有一个非负整数Aij,(Aij <= 1000)现 ...
- codevs1227:方格取数2
题目描述 Description 给出一个n*n的矩阵,每一格有一个非负整数Aij,(Aij <= )现在从(,)出发,可以往右或者往下走,最后到达(n,n),每达到一格,把该格子的数取出来,该 ...
- 【P2405】方格取数问题加强版(费用流)
考虑如何建图.还是老样子先拆点,然后把每两个点之间连接两条边,一条流量为1,费用为-点权,处理是否走这个点.一条流量无限,没有费用,因为哪怕一个点选过了,它的地方还是可以重复走过去的. 然后把经由一个 ...
- HDU 3376 && 2686 方格取数 最大和 费用流裸题
题意: 1.一个人从[1,1] ->[n,n] ->[1,1] 2.仅仅能走最短路 3.走过的点不能再走 问最大和. 对每一个点拆点限流为1就可以满足3. 费用流流量为2满足1 最大费用流 ...
- codevs1227 方格取数2 注意数组啊啊啊啊啊啊啊啊啊啊
一开始T了一组RE了一组,实在找不出错来,就把数组加了一个0竟然就多A了一组.很惊讶的又加了几个0最后竟然全A了!!! 懒得做了,改的是之前的那个蚯蚓的游戏问题.还是需要拆点,至于为什么不能重复走结点 ...
- 【P2774】方格取数问题(贪心+最大流,洛谷)
首先,我们要读懂这道题,否则你会和我一开始产生一样的疑问,把所有的数都取走剩下一个最小的不就可以了么???然后我们发现样例完全不是这么回事.题目中所说的使相邻的两个数没有公共边,是指你去走的数,也就是 ...
随机推荐
- hdu1045Fire Net(经典dfs)
Fire Net Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Su ...
- 微信小程序—day03
昨日问题 接着上一篇,昨天遇到的scroll-view组件不能滚动的问题. 今天经过调试,发现是由于:图片的实际宽高,大于给image设定的宽高导致的. 解决办法: 减小图片的实际宽高,使之小于ima ...
- 【outPut_Class 输出类】使用说明
对象:outPut 说明:定义输出结果类的相关操作.此对象的核心是[JSON]类,所以它继承了[JSON]类的所有方法 重要: 输出结果样式为XML时,自带根节点"root".输出 ...
- [HNOI2018]寻宝游戏(题解转载自别处)
题解(自别处转载): Luogu CSDN 这题关键是将运算符也替换成0,1 然后在运算符与原串混杂里找规律. 而且替换的方式也有所要求,考场上两种替换方式都要尝试. #include <bit ...
- ffmpeg接收rtsp流问题
项目使用mingw环境g++5.3,C++调用ffmpeg接收rtsp流,再通过C#显示.结构上是C#调用C++的so文件,读取得到的视频帧(RGB888格式),通过图片控件显示. 一开始是使用ope ...
- Redis 错误摘记篇
yum安装的redis提示如下报错,大概意思就是配置文件和redis-server进程文件版本不一致.. [root@vm-10-104-28-24 yum.repos.d]# redis-serve ...
- Alpha 冲刺(1/10)
队名 火箭少男100 组长博客 林燊大哥 作业博客 Alpha 冲鸭! 成员冲刺阶段情况 林燊(组长) 过去两天完成了哪些任务 协调各成员之间的工作,对多个目标检测及文字识别模型进行评估.实验,选取较 ...
- Objective-C 反射机制
该文章属于<简书 — 刘小壮>原创,特此感谢:<简书 — 刘小壮> http://www.jianshu.com/p/5bbde2480680 了解反射机制 Objective ...
- 3dContactPointAnnotationTool开发日志(十六)
调了一上午才发现是把下面这个函数: private float DivideTriangle(int []triangle,out int []outTriangle,List<Vector ...
- week1 技术随笔
类别c 内容c 开始时间s 结束时间e 被打断时间I 总计(min) 9.5 随笔 构建之法福后感 22:00 24:00 7 113 9.6 分析 需求分析 9:00 9:30 2 28 编码 词频 ...