题目链接 https://cn.vjudge.net/problem/POJ-3422

【题意】
给出一个N*N的矩阵,然后从左上角走到右下角,每次走只能是往下或者往右走,走一次就将这个位置上的数字加到sum和中,然后这个位置的数字置为0。从左上到右下走K次,问最大和。

【思路】
最小费用最大流,把每一个位置拆成两个点,代价为该位置的值,容量为1(代表走一次就将其置为0)。然后前一个点与后一个点再建立一条代价为0,容量为K-1的边,代表你还可以从这里走,但是这个位置的值你是取不到了。再加上一个超级源点与汇点,代价为0,容量为K。跑一次就是结果。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;const int inf=2e9;
const int maxn=5005;struct Edge{int from,to,cap,flow,cost;Edge(int u,int v,int c,int f,int co):from(u),to(v),cap(c),flow(f),cost(co){}
};struct MCMF{int n,m,s,t;vector<Edge> edges;vector<int> g[maxn];int inq[maxn];  int d[maxn];    int p[maxn];    int a[maxn];    void init(int n){this->n=n;for(int i=0;i<n;++i) g[i].clear();edges.clear();}void add(int from,int to,int cap,int cost){edges.push_back(Edge(from,to,cap,0,cost));edges.push_back(Edge(to,from,0,0,-cost));m=edges.size();g[from].push_back(m-2);g[to].push_back(m-1);}bool BellmanFord(int s,int t,int& flow,long long& cost){for(int i=0;i<n;++i) d[i]=inf;memset(inq,0,sizeof(inq));d[s]=0;inq[s]=1;p[s]=0;a[s]=inf;queue<int> que;que.push(s);while(!que.empty()){int u=que.front();que.pop();inq[u]=0;for(int i=0;i<g[u].size();++i){Edge& e=edges[g[u][i]];if(e.cap>e.flow && d[e.to]>d[u]+e.cost){d[e.to]=d[u]+e.cost;p[e.to]=g[u][i];a[e.to]=min(a[u],e.cap-e.flow);if(!inq[e.to]){ que.push(e.to);inq[e.to]=1; }}}}if(d[t]==inf) return false;flow+=a[t];cost+=(long long)d[t]*(long long)a[t];for(int u=t;u!=s;u=edges[p[u]].from){edges[p[u]].flow+=a[t];edges[p[u]^1].flow-=a[t];}return true;}int MincostMaxflow(int s,int t,long long& cost){int flow=0;cost=0;while(BellmanFord(s,t,flow,cost));return flow;}
};int n,k;
int a[55][55];
MCMF g;int main(){scanf("%d%d",&n,&k);for(int i=1;i<=n;++i) for(int j=1;j<=n;++j) scanf("%d",&a[i][j]);g.init(n*n*2+2);int s=0,t=n*n*2+1;g.add(s,1,k,0);g.add(n*n*2,t,k,0);for(int i=1;i<=n;++i){for(int j=1;j<=n;++j){int in=(i-1)*n+j;int out=in+n*n;g.add(in,out,1,-a[i][j]);g.add(in,out,k-1,0);if(j+1<=n){int rin=in+1;g.add(out,rin,k,0);}if(i+1<=n){int din=in+n;g.add(out,din,k,0);}}}long long ans;g.MincostMaxflow(s,t,ans);printf("%lld\n",-ans);return 0;
}

POJ 3422 - Kaka's Matrix Travels(最小费用流)相关推荐

  1. poj 3422 Kaka's Matrix Travels(最小费用最大流)

    题目链接 Kaka's Matrix Travels Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9394   Accep ...

  2. POJ - 3422 Kaka's Matrix Travels(网络流-最大费用最大流+拆点法)

    题目链接:点击查看 题目大意:K取方格数,是在一个N*N的矩形网格中,每个格子里都写着一个整数.可以从左上角到右下角安排K条路线,每一步只能往下或往右,沿途经过的格子中的整数会被取走.若多条路线重复经 ...

  3. POJ 3422 Kaka's Matrix Travels

    题目链接:ヾ(≧∇≦*)ゝ 大致题意:给你一个\(n*n\)的矩阵从\((1,1)\)出发,到\((n,n)\)结束,只能走右边或左边.每个点在被走过之后权值变成0,问走\(k\)次后,能获得的最大值 ...

  4. POJ 3422 Kaka's Matrix Travels | 费用流

    最初的想法是这样的,先走一条最大费用流,沿路回来把所有的点的权值更新为0,然后再跑最大费用流,嗯,好像很对.后来想想,这完全不符合网络流的思想啊Orz. 题意: 一个矩阵,每个grid都有一个权值.从 ...

  5. poj 3422 Kaka's Matrix Travels 费用流

    题目链接 给一个n*n的矩阵, 从左上角出发, 走到右下角, 然后在返回左上角,这样算两次. 一共重复k次, 每个格子有值, 问能够取得的最大值是多少, 一个格子的值只能取一次, 取完后变为0. 费用 ...

  6. pku 3422 Kaka's Matrix Travels 最大费用最大流

    http://poj.org/problem?id=3422 /* 题意:给定一个n*n的矩形方格,要求从(1,1)出发,只能往右下角走,(i + 1,j) 或者 (i + n,j)每次走完将格子里面 ...

  7. poj3422 Kaka's Matrix Travels(最小费用最大流问题)

    1 /* 2 poj3422 Kaka's Matrix Travels 3 不知道 k次 dp做为什么不对??? 4 看了大牛的代码,才知道还可以这样做! 5 开始没有理解将a 和 a' 之间建立怎 ...

  8. Kaka's Matrix Travels(减弱版) DP版

    Kaka's Matrix Travels(减弱版) Time Limit:5000MS  Memory Limit:65536K Total Submit:15 Accepted:8 Descrip ...

  9. POJ3422 Kaka's Matrix Travels

    描述 On an N × N chessboard with a non-negative number in each grid, Kaka starts his matrix travels wi ...

  10. hdu Kaka's Matrix Travels(最小费用最大流)

    把题意写一下:  给你一个n*n的矩阵,每个格子都有一个非负整数,从左上角走到右下角,收集走过的数字,累加,但是只能向右或者向下走,走过之后数字就变为0,让你求从左上角到右下角,走k次之后,所得的最大 ...

最新文章

  1. 年度书单盘点 | 史上最卷考研潮过后,这十本书让你不再迷茫
  2. order by 索引
  3. 关于如如何运行tensorrt
  4. redhat 6.4 安装ftp
  5. 我在架构设计和代码开发中的一些常用原则
  6. 逻辑人渴望控制那些让他们感兴趣的东西
  7. 深度学习(二十六)Network In Network学习笔记
  8. html ie8上传图片,图片上传本地预览兼容ie8
  9. Android的ArrayAdapter、SimpleAdapter、BaseAdapter与ListView的使用
  10. 猎洞高手Orange Tsai 亲自讲解 ProxyShell write-up
  11. atitit.系统架构图 的设计 与工具 attilax总结
  12. 【工控】脉冲当量怎么算?
  13. matlab里面的取整函数
  14. Python 爬虫:专利信息
  15. WP-Super-Cache的使用
  16. rtmp协议发送mp3和aac裸流的方法
  17. 数据库小型教务系统,成绩管理系统
  18. redis与ssm整合(mybatis二级缓存)单机版
  19. Navicat因导入的sql文件中时间数据类型有参数而报错的原因(例:datetime(3))
  20. mysql 分位数 知乎_分位数的意义是什么?

热门文章

  1. SRGAN-超分辨率图像复原
  2. ZZULIOJ-1035,分段函数求值(Python)
  3. html tbody边框,tbody边框呈现问题
  4. 将VBS脚本编译成加密版本的VBE脚本
  5. wps中vbe6ext.olb不能被加载问题(附WPS2019宏下载)
  6. MCS-51系列单片机硬件结构
  7. 简单做份西红柿炒蛋778
  8. brpc中的协程bthread源码剖析(一):Work Stealing以及任务的执行与切换
  9. 学习笔记(05):mySQL数据库开发教程-域完整性-默认值约束
  10. Python案例1—人民币与美元的汇率兑换V_8.0