网络流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(最大费用最大流)的更多相关文章

  1. P2045 方格取数加强版 最大费用最大流

    $ \color{#0066ff}{ 题目描述 }$ 给出一个n*n的矩阵,每一格有一个非负整数Aij,(Aij <= 1000)现在从(1,1)出发,可以往右或者往下走,最后到达(n,n),每 ...

  2. 【Codevs1227】方格取数2(费用流)

    题意:给出一个n*n的矩阵,每一格有一个非负整数Aij,(Aij <= 1000) 现在从(1,1)出发,可以往右或者往下走,最后到达(n,n),每达到一格,把该格子的数取出来,该格子的数就变成 ...

  3. 【wikioi】1227 方格取数 2(费用流)

    http://www.wikioi.com/problem/1227 裸题,拆点,容量为1,费用为点权的负数(代表只能取一次).再在拆好的两个点连边,容量为oo,费用为0.(代表能取0) 然后向右和下 ...

  4. 洛谷 P2045 方格取数加强版【费用流】

        题目链接:https://www.luogu.org/problemnew/show/P2045 题目描述 给出一个n*n的矩阵,每一格有一个非负整数Aij,(Aij <= 1000)现 ...

  5. codevs1227:方格取数2

    题目描述 Description 给出一个n*n的矩阵,每一格有一个非负整数Aij,(Aij <= )现在从(,)出发,可以往右或者往下走,最后到达(n,n),每达到一格,把该格子的数取出来,该 ...

  6. 【P2405】方格取数问题加强版(费用流)

    考虑如何建图.还是老样子先拆点,然后把每两个点之间连接两条边,一条流量为1,费用为-点权,处理是否走这个点.一条流量无限,没有费用,因为哪怕一个点选过了,它的地方还是可以重复走过去的. 然后把经由一个 ...

  7. HDU 3376 &amp;&amp; 2686 方格取数 最大和 费用流裸题

    题意: 1.一个人从[1,1] ->[n,n] ->[1,1] 2.仅仅能走最短路 3.走过的点不能再走 问最大和. 对每一个点拆点限流为1就可以满足3. 费用流流量为2满足1 最大费用流 ...

  8. codevs1227 方格取数2 注意数组啊啊啊啊啊啊啊啊啊啊

    一开始T了一组RE了一组,实在找不出错来,就把数组加了一个0竟然就多A了一组.很惊讶的又加了几个0最后竟然全A了!!! 懒得做了,改的是之前的那个蚯蚓的游戏问题.还是需要拆点,至于为什么不能重复走结点 ...

  9. 【P2774】方格取数问题(贪心+最大流,洛谷)

    首先,我们要读懂这道题,否则你会和我一开始产生一样的疑问,把所有的数都取走剩下一个最小的不就可以了么???然后我们发现样例完全不是这么回事.题目中所说的使相邻的两个数没有公共边,是指你去走的数,也就是 ...

随机推荐

  1. 即刻开始使用Kotlin开发Android的12个原因(KAD 30)

    作者:Antonio Leiva 时间:Jul, 11, 2017 原文链接:https://antonioleiva.com/reasons-kotlin-android/ 这组文章已到最后了,它们 ...

  2. Unity初探—SpaceShoot

    Unity初探—SpaceShoot DestroyByBoundary脚本(C#) 在游戏中我们添加了一个Cube正方体,让他来作为游戏的边界.它是可以触发触发事件的(勾选Is Trigger),当 ...

  3. [JSON].getObj( keyPath )

    语法:[JSON].getObj( keyPath ) 返回:[JSON] 说明:返回指定键名路径的JSON对象,指定键名路径不存在时返回空的toJson对象(强烈建议使用 [JSON].exists ...

  4. 【system.folder】使用说明

    对象:system.folder 说明:提供一系列针对文件夹的操作 目录: 方法 返回 说明 system.folder.exists(folderPath) [True | False] 检测指定文 ...

  5. Python版本切换和Pip安装

    Python版本切换 现在常用的linux系统中都会默认携带python运行环境,在ubuntu 16.04 和centos 7.3中携带有Python 2.7 和Python3.5两个版本, 默认使 ...

  6. 【Linux 运维】Centos7初始化网络配置

    设置网络 (1)动态获取一个IP地址 #dhclient        系统自动自动获取一个IP地址#ip addr         查看获取的ip地址(2)查看网关,子网掩码 虚拟机编辑>虚拟 ...

  7. openstack多region介绍与实践---转

    概念介绍 所谓openstack多region,就是多套openstack共享一个keystone和horizon.每个区域一套openstack环境,可以分布在不同的地理位置,只要网络可达就行.个人 ...

  8. “Hello world!”团队—团队选题展示(视频展示说明)

    本次博客的主要内容基本分为以下两方面: 一.视频截图展示 二.视频简要说明 博客内容展示: 视频截图1: 简要说明:这是组长在视频前期简要介绍我们这款游戏项目的内容.从可行性和需求市场方面进行了简要阐 ...

  9. java — 设计模式

    设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 一.设计模式的分类 ...

  10. OSG学习:矩阵变换节点示例

    #include<osgViewer\Viewer> #include<osg\Node> #include<osg\Geode> #include<osg\ ...