POJ 3422 Kaka's Matrix Travels(拆点+最大费用流)题解
题意:小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(拆点+最大费用流)题解相关推荐
- poj 3422 Kaka's Matrix Travels(最小费用最大流)
题目链接 Kaka's Matrix Travels Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9394 Accep ...
- POJ - 3422 Kaka's Matrix Travels(网络流-最大费用最大流+拆点法)
题目链接:点击查看 题目大意:K取方格数,是在一个N*N的矩形网格中,每个格子里都写着一个整数.可以从左上角到右下角安排K条路线,每一步只能往下或往右,沿途经过的格子中的整数会被取走.若多条路线重复经 ...
- POJ 3422 Kaka's Matrix Travels
题目链接:ヾ(≧∇≦*)ゝ 大致题意:给你一个\(n*n\)的矩阵从\((1,1)\)出发,到\((n,n)\)结束,只能走右边或左边.每个点在被走过之后权值变成0,问走\(k\)次后,能获得的最大值 ...
- POJ 3422 Kaka's Matrix Travels | 费用流
最初的想法是这样的,先走一条最大费用流,沿路回来把所有的点的权值更新为0,然后再跑最大费用流,嗯,好像很对.后来想想,这完全不符合网络流的思想啊Orz. 题意: 一个矩阵,每个grid都有一个权值.从 ...
- poj 3422 Kaka's Matrix Travels 费用流
题目链接 给一个n*n的矩阵, 从左上角出发, 走到右下角, 然后在返回左上角,这样算两次. 一共重复k次, 每个格子有值, 问能够取得的最大值是多少, 一个格子的值只能取一次, 取完后变为0. 费用 ...
- pku 3422 Kaka's Matrix Travels 最大费用最大流
http://poj.org/problem?id=3422 /* 题意:给定一个n*n的矩形方格,要求从(1,1)出发,只能往右下角走,(i + 1,j) 或者 (i + n,j)每次走完将格子里面 ...
- poj3422 Kaka's Matrix Travels(最小费用最大流问题)
1 /* 2 poj3422 Kaka's Matrix Travels 3 不知道 k次 dp做为什么不对??? 4 看了大牛的代码,才知道还可以这样做! 5 开始没有理解将a 和 a' 之间建立怎 ...
- Kaka's Matrix Travels(减弱版) DP版
Kaka's Matrix Travels(减弱版) Time Limit:5000MS Memory Limit:65536K Total Submit:15 Accepted:8 Descrip ...
- POJ3422 Kaka's Matrix Travels
描述 On an N × N chessboard with a non-negative number in each grid, Kaka starts his matrix travels wi ...
- hdu Kaka's Matrix Travels(最小费用最大流)
把题意写一下: 给你一个n*n的矩阵,每个格子都有一个非负整数,从左上角走到右下角,收集走过的数字,累加,但是只能向右或者向下走,走过之后数字就变为0,让你求从左上角到右下角,走k次之后,所得的最大 ...
最新文章
- 机器学习作用于信息安全的五大顶级案例
- 理解TCP序列号(Sequence Number)和确认号(Acknowledgment Number)
- 3_电子商务开发模型与java的关系_计算机网络与软件工程专业作业答案
- JVM内幕:Java虚拟机详解
- 递归方法计划销售订单的计划物料成本
- Oracle报错:类型长度大于最大值解决办法
- .NET6之MiniAPI(二十三):Refit
- dropbox_Dropbox的5种开源替代品
- 堂堂小米手表竟比不上小天才电话手表?不支持视频和拍照...
- 停下来,等等灵魂(三)
- java Calendar的学习分享
- PlatformTransactionManager
- File Converter——万能格式转化神器
- Windows7不再卡五叶草,更新了bootx64.efi和bootmgfw.efi文件,支持安全启动,不用关闭安全启动和打开csm支持.
- 实际使用Windows 7中的Readyboost功能
- Udacity CH2中.bag 文件解析
- uniapp使用uni-ui插件的方式
- Linux WiFi使用
- 1+X 云计算平台运维与开发(初级)
- 360周鸿祎:互联网成功十大案例
热门文章
- error: X11/extensions/XInput.h: No such file or directory(转)
- 云计算数据中心的特点
- 《产品前线:48位一线互联网产品经理的智慧与实战》读书笔记3
- css盒模型(标准模式和怪异模式)
- 博士申请 | 浙江大学孙优贤院士课题组招收智能无人系统方向硕士生/博士生
- 2012服务器系统 3389,windows 2012r2如何修改默认的3389远程端口
- 爬取链家任意城市租房数据(北京朝阳)
- 性能优化,进无止境-内存篇(上)
- 35岁的程序员:第18章,私欲
- 正则限定开头和取反 (否)