codevs1227
费用流,其实是求传输一个容量为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的更多相关文章
- 【codevs1227】 方格取数 2
http://codevs.cn/problem/1227/ (题目链接) 题意 N*N的方格,每个格子中有一个数,寻找从(1,1)走到(N,N)的K条路径,使得取到的数的和最大. Solution ...
- 【Codevs1227】方格取数2(费用流)
题意:给出一个n*n的矩阵,每一格有一个非负整数Aij,(Aij <= 1000) 现在从(1,1)出发,可以往右或者往下走,最后到达(n,n),每达到一格,把该格子的数取出来,该格子的数就变成 ...
- codevs1227 方格取数2 注意数组啊啊啊啊啊啊啊啊啊啊
一开始T了一组RE了一组,实在找不出错来,就把数组加了一个0竟然就多A了一组.很惊讶的又加了几个0最后竟然全A了!!! 懒得做了,改的是之前的那个蚯蚓的游戏问题.还是需要拆点,至于为什么不能重复走结点 ...
- [CodeVs1227]方格取数2(最大费用最大流)
网络流24题的坑还没填完,真的要TJ? 题目大意:一个n*n的矩阵,每格有点权,从(1,1)出发,可以往右或者往下走,最后到达(n,n),每达到一格,把该格子的数取出来,该格子的数就变成0,这样一共走 ...
- codevs1227:方格取数2
题目描述 Description 给出一个n*n的矩阵,每一格有一个非负整数Aij,(Aij <= )现在从(,)出发,可以往右或者往下走,最后到达(n,n),每达到一格,把该格子的数取出来,该 ...
- [codevs1227]草地排水<Dinic网络流最大流>
题目链接:http://codevs.cn/problem/1993/ https://www.luogu.org/problemnew/show/P2740 之前一直都没去管网络流这算法,但是老师最 ...
- codevs 1033 蚯蚓的游戏问题
Description 在一块梯形田地上,一群蚯蚓在做收集食物游戏.蚯蚓们把梯形田地上的食物堆积整理如下: a(1,1) a(1,2)…a(1,m) a(2,1) a(2,2) a(2,3)…a ...
- 图论:费用流-SPFA+EK
利用SPFA+EK算法解决费用流问题 例题不够裸,但是还是很有说服力的,这里以Codevs1227的方格取数2为例子来介绍费用流问题 这个题难点在建图上,我感觉以后还要把网络流建模想明白才能下手去做这 ...
随机推荐
- AC日记——矩阵交换行 openjudge 1.8 01
01:矩阵交换行 总时间限制: 1000ms 内存限制: 65536kB 描述 给定一个5*5的矩阵(数学上,一个r×c的矩阵是一个由r行c列元素排列成的矩形阵列),将第n行和第m行交换,输出交换 ...
- 运维利器-ClusterShell集群管理操作记录
在运维实战中,如果有若干台数据库服务器,想对这些服务器进行同等动作,比如查看它们当前的即时负载情况,查看它们的主机名,分发文件等等,这个时候该怎么办?一个个登陆服务器去操作,太傻帽了!写个shell去 ...
- BZOJ 1036: [ZJOI2008]树的统计Count
1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec Memory Limit: 162 MB Submit: 14354 Solved: 5802 [Subm ...
- android 混淆文件proguard.cfg详解
-optimizationpasses 5 [代码压缩级别]-dontusemixedcaseclassnames [混淆时不会产生形形色色的类名 ]-dontskipnonpubliclibrar ...
- 航空货运:运价类别Rate Class
1.普通货物运价(1)基础运价(代号N -注:Normal的首字母)民航总局统一规定各航段货物基础运价为45公斤以下普通货物运价.(2)重量分界点运价(代号Q -注:Quantity的首字母)国内航 ...
- 如何使用 UC浏览器开发者版 进行移动端调试
在 如何用 fiddler 代理调试本地手机页 一文中我们了解了如何用手机查看 PC 端写的网页(本地),但是我们只能看到页面效果,如果哪段 js 挂了,那部分样式失效了,我们该如何进行调试呢?今天为 ...
- ASP.NET MVC运行机制源码剖析
我们都知道ASP.NET首先是从Global.aspx中开始运行的, 在Application_Start()中添加路由映射后, 就由URLRouting组件创建IRouteHandler并执行, 在 ...
- Excel导入导出,通过datatable转存(篇一)
//导入数据 public ActionResult ExpressInfoImport() { var ptcp = new BaseResponse() { DoFlag = true, DoRe ...
- [BZOJ 1260][CQOI2007]染色(DP)
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1260 分析: f[i][j]表示i~j刷成s[i]~s[j]这个样子需要的最小次数 则 ...
- java发送邮件
1.需要用到javax.mail怎么下载呢?百度javax.mail就会看见http://www.oracle.com/technetwork/java/index-138643.html实际上这个项 ...