题意:小A从左上角走到右下角,每个格子都有一个价值,经过这个格子就把价值拿走,每次只能往下或往右走,问你走k次最多能拿多少价值的东西。

思路:这里有一个限制条件就是经过之后要把东西拿走,也就是每一格的价值只能拿一次,这也能用拆点。我们把一个点拆成两个,建两条边,一条流量1费用-cost,另一条流量k-1,费用0,这样就完成了。

代码:

#include<cstdio>
#include<vector>
#include<stack>
#include<queue>
#include<cstring>
#include<string>
#include<cmath>
#include<cstdlib>
#include<algorithm>
#define ll long long
const int maxn = 20000+5;
const int maxm = 100000+5;
const int MOD = 1e7;
const int INF = 0x3f3f3f3f;
using namespace std;
struct Edge{int to,next,cap,flow,cost;
}edge[maxm];
int head[maxn],tot;
int pre[maxn],dis[maxn];
bool vis[maxn];
int N,M;
void init(){N = maxn;tot = 0;memset(head,-1,sizeof(head));
}
void addEdge(int u,int v,int cap,int cost){edge[tot].to = v;edge[tot].cap = cap;    //容量edge[tot].flow = 0;edge[tot].cost = cost;edge[tot].next = head[u];head[u] = tot++;edge[tot].to = u;edge[tot].cap = 0;edge[tot].flow = 0;edge[tot].cost = -cost;edge[tot].next = head[v];head[v] = tot++;
}
bool spfa(int s,int t){queue<int> q;for(int i = 0;i < N;i++){dis[i] = INF;vis[i] = false;pre[i] = -1;}dis[s] = 0;vis[s] = true;q.push(s);while(!q.empty()){int u = q.front();q.pop();vis[u] = false;for(int i = head[u];i != -1;i = edge[i].next){int v = edge[i].to;if(edge[i].cap > edge[i].flow && dis[v] > dis[u] + edge[i].cost){dis[v] = dis[u] + edge[i].cost;pre[v] = i;if(!vis[v]){vis[v] = true;q.push(v);}}}}return pre[t] != -1;
}int MCMF(int s,int t,int &cost){int flow = 0;cost = 0;while(spfa(s,t)){int MIN = INF;for(int i = pre[t];i != -1;i = pre[edge[i^1].to]){if(MIN > edge[i].cap - edge[i].flow){MIN = edge[i].cap - edge[i].flow;}}for(int i = pre[t];i != -1; i = pre[edge[i^1]. to]){edge[i]. flow += MIN;edge[i^1]. flow -= MIN;cost += edge[i]. cost * MIN;}flow += MIN;}return flow;
}
int mp[55][55],n;
int lp(int i,int j){ return n*(i - 1) + j; };
int rp(int i,int j){ return n*n + n*(i - 1) + j; }
int main(){int k;while(scanf("%d%d",&n,&k) != EOF){init();for(int i = 1;i <= n;i++){for(int j = 1;j <= n;j++){scanf("%d",&mp[i][j]);addEdge(lp(i,j),rp(i,j),1,-mp[i][j]);addEdge(lp(i,j),rp(i,j),k - 1,0);if(i < n)addEdge(rp(i,j),lp(i + 1,j),k,0);if(j < n)addEdge(rp(i,j),lp(i,j + 1),k,0);}}addEdge(0,lp(1,1),k,0);addEdge(rp(n,n),rp(n,n) + 1,k,0);int cost;MCMF(0,rp(n,n) + 1,cost);printf("%d\n",-cost);}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. 理解TCP序列号(Sequence Number)和确认号(Acknowledgment Number)
  3. 3_电子商务开发模型与java的关系_计算机网络与软件工程专业作业答案
  4. JVM内幕:Java虚拟机详解
  5. 递归方法计划销售订单的计划物料成本
  6. Oracle报错:类型长度大于最大值解决办法
  7. .NET6之MiniAPI(二十三):Refit
  8. dropbox_Dropbox的5种开源替代品
  9. 堂堂小米手表竟比不上小天才电话手表?不支持视频和拍照...
  10. 停下来,等等灵魂(三)
  11. java Calendar的学习分享
  12. PlatformTransactionManager
  13. File Converter——万能格式转化神器
  14. Windows7不再卡五叶草,更新了bootx64.efi和bootmgfw.efi文件,支持安全启动,不用关闭安全启动和打开csm支持.
  15. 实际使用Windows 7中的Readyboost功能
  16. Udacity CH2中.bag 文件解析
  17. uniapp使用uni-ui插件的方式
  18. Linux WiFi使用
  19. 1+X 云计算平台运维与开发(初级)
  20. 360周鸿祎:互联网成功十大案例

热门文章

  1. error: X11/extensions/XInput.h: No such file or directory(转)
  2. 云计算数据中心的特点
  3. 《产品前线:48位一线互联网产品经理的智慧与实战》读书笔记3
  4. css盒模型(标准模式和怪异模式)
  5. 博士申请 | 浙江大学孙优贤院士课题组招收智能无人系统方向硕士生/博士生
  6. 2012服务器系统 3389,windows 2012r2如何修改默认的3389远程端口
  7. 爬取链家任意城市租房数据(北京朝阳)
  8. 性能优化,进无止境-内存篇(上)
  9. 35岁的程序员:第18章,私欲
  10. 正则限定开头和取反 (否)