费用流,其实是求传输一个容量为k的流的最大费用。主要是建图。原点为0,和1连上一条容量为k,费用为0的边,中间每个点拆成两个1和2,连上一条边,容量为k,费用为c,再连一条容量为比k大,费用为0的边,这样是为了跑完费用之后能继续跑拆完后的点和。然后和其他边连上就可以了。n*n和汇点连上一条容量为k,费用为0的边。我就是每次跑了一个容量为1的流,求打脸,不知道对不对。

#include<iostream>
#include<queue>
#include<cstdio>
#include<cstring>
using namespace std;
const int inf=0x3f3f3f3f;
struct edge
{
int to,nxt,c,f;
}e[];
int n,k,cur,ans,cnt=;
int dist[],used[],pree[],prev[],g[];
void link(int u,int v,int f,int c)
{
e[++cnt].nxt=g[u];
g[u]=cnt;
e[cnt].f=f;
e[cnt].to=v;
e[cnt].c=c;
}
void ins(int u,int v,int f,int c)
{
link(u,v,f,c);
link(v,u,,-c);
}
int Min(int x,int y)
{
return x<y?x:y;
}
bool spfa()
{
queue<int>q;
memset(dist,-,sizeof(dist));
memset(used,,sizeof(used));
dist[]=;
q.push();
while(!q.empty())
{
int u=q.front(); q.pop();
used[u]=;
for(int i=g[u];i;i=e[i].nxt)
{
int v=e[i].to,w=e[i].c;
if(e[i].f&&dist[v]<dist[u]+w)
{
dist[v]=dist[u]+w;
prev[v]=u; pree[v]=i;
if(!used[v])
{
q.push(v);
used[v]=;
}
}
}
}
return dist[]!=-;
}
int MinCostFlow()
{
int u=,sum=inf;
while(u)
{
e[pree[u]].f--;
e[pree[u]^].f++;
u=prev[u];
}
// cout<<dist[10010]<<endl;
return dist[];
}
void MinFlow()
{
while(spfa())
{
cur+=MinCostFlow();
if(cur>ans) ans=cur;
}
printf("%d",ans);
}
int main()
{
scanf("%d%d",&n,&k);
for(int i=;i<=n;i++)
{
for(int j=;j<=n;j++)
{
int x; scanf("%d",&x);
ins((i-)*n+j,(i-)*n+j+n*n,,x);
ins((i-)*n+j,(i-)*n+j+n*n,k,);
if(i!=n)
{
ins((i-)*n+j+n*n,i*n+j,k,);
}
if(j!=n)
{
ins((i-)*n+j+n*n,(i-)*n+j+,k,);
}
}
}
ins(,,k,);
ins(n*n*,,k,);
MinFlow();
return ;
}

codevs1227的更多相关文章

  1. 【codevs1227】 方格取数 2

    http://codevs.cn/problem/1227/ (题目链接) 题意 N*N的方格,每个格子中有一个数,寻找从(1,1)走到(N,N)的K条路径,使得取到的数的和最大. Solution ...

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

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

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

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

  4. [CodeVs1227]方格取数2(最大费用最大流)

    网络流24题的坑还没填完,真的要TJ? 题目大意:一个n*n的矩阵,每格有点权,从(1,1)出发,可以往右或者往下走,最后到达(n,n),每达到一格,把该格子的数取出来,该格子的数就变成0,这样一共走 ...

  5. codevs1227:方格取数2

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

  6. [codevs1227]草地排水<Dinic网络流最大流>

    题目链接:http://codevs.cn/problem/1993/ https://www.luogu.org/problemnew/show/P2740 之前一直都没去管网络流这算法,但是老师最 ...

  7. codevs 1033 蚯蚓的游戏问题

    Description 在一块梯形田地上,一群蚯蚓在做收集食物游戏.蚯蚓们把梯形田地上的食物堆积整理如下: a(1,1)  a(1,2)…a(1,m) a(2,1)  a(2,2)  a(2,3)…a ...

  8. 图论:费用流-SPFA+EK

    利用SPFA+EK算法解决费用流问题 例题不够裸,但是还是很有说服力的,这里以Codevs1227的方格取数2为例子来介绍费用流问题 这个题难点在建图上,我感觉以后还要把网络流建模想明白才能下手去做这 ...

随机推荐

  1. u3d单词学习plane

    plane n.水平: 平面: 飞机: 木工刨

  2. [No00004B]Windows 下面为Python3.5安装NoteBook

    python3.5安装NoteBook,网上搜了一下教程,几乎很多转帖,或者是2.x版本的,很少有直接可以用的.自己琢磨了一下午,终于搞定了,现在贴出来.希望大家以后转帖什么的都先测试一下,互联网时代 ...

  3. 程序Bug---易错点

    只有当图像与HTML文档在同一目录时,才能用相对地址显示.

  4. 部署Linux下的man慢查询中文帮助手册环境

    对于Linux运维工作者来说,man查询手册绝对是一个好东西.当我们对一些命令或参数有些许模糊时,可以通过man查询手册来寻求帮助.其实Linux之所以强大, 就在于其强大的命令行, 面对如此繁杂的命 ...

  5. jquery.validate.min.js 用法方法示例

    页面html 代码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://w ...

  6. Windows 提高效率的常用快捷键

    开发中减少使用鼠标次数,是一个很cool的体验!下面的快捷键在Win7上测试有效 快捷键 说明 Ctrl+Shift+N 创建一个新的文件夹. (Ctrl + N  打开桌面) Ctrl+Shift+ ...

  7. velocity模板引擎学习(1)

    velocity与freemaker.jstl并称为java web开发三大标签技术,而且velocity在codeplex上还有.net的移植版本NVelocity,(注:castle团队在gith ...

  8. 翻译qmake文档(三) Creating Project Files

    翻译qmake文档 目录   原英文文档:http://qt-project.org/doc/qt-5/qmake-project-files.html   创建项目文件 项目文件包含qmake构建你 ...

  9. Infer.net 开源组件: 1, 机器学习入门,要从贝叶斯说起

    我的入门方式,先从应用现象中,总结规律反推本质.一头扎进理论书籍是不对的. 老外的先进,还是体现在传承方面.没办法,我们竞争压力大,有好东西藏着掖着.大家都苦逼 我最开始是从介绍,有了基本概念,见xx ...

  10. JAVA_集合框架虐我千百遍,虐也是一种进步

    1.Collection和Collections区别: Collection是java的一个集合接口,集合类的顶级接口 Collections是一个包装类(工具类),不能被实例化(由于其构造函数设为私 ...