POJ 3422 Kaka's Matrix Travels(最小费用最大流)
http://poj.org/problem?id=3422
题意 : 给你一个N*N的方格,每个格子有一个数字,让你从左上角开始走,只能往下往右走,走过的数字变为0,走K次,问最大能是多大,累加的。
思路 :http://blog.csdn.net/qq172108805/article/details/7857503,这道题挺难的,我也是看的题解。
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <queue>
#include <stdlib.h>
#include <algorithm> using namespace std; const int maxn = ;
const int INF = ;
const int maxm = ; struct node
{
int u,v,c,f,b,next ;
}map[maxm] ;
bool flag[maxn] ;
int cap[][],dist[maxn],pre[maxn],head[maxn] ;
int s,t,n,k,ans,cnt ;
int del,val ; void addedge(int u,int v,int c,int b)
{
map[cnt].u = u ;
map[cnt].v = v ;
map[cnt].c = c ;
map[cnt].b = b ;
map[cnt].f = ;
map[cnt].next = head[u] ;
head[u] = cnt++ ; map[cnt].u = v ;
map[cnt].v = u ;
map[cnt].c = ;
map[cnt].b = -b ;
map[cnt].f = ;
map[cnt].next = head[v] ;
head[v] = cnt++ ;
} void spfa()
{
memset(flag,,sizeof(flag)) ;
queue<int >Q ;
Q.push(s) ;
flag[s] = true ;
while(!Q.empty())
{
int x = Q.front() ;
Q.pop() ;
flag[x] = false ;
for(int i = head[x] ; i+ ; i = map[i].next)
{
int y = map[i].v ;
if(map[i].c > map[i].f && dist[y] < dist[x] + map[i].b)
{
dist[y] = dist[x]+map[i].b ;
pre[y] = i ;
if(!flag[y])
{
flag[y] = true ;
Q.push(y) ;
}
}
}
}
} void mcmf()
{
for( ; ; )
{
memset(dist,-,sizeof(dist)) ;
memset(pre,-,sizeof(pre)) ;
dist[s] = ;
spfa() ;
if(dist[t] == -)
break ;
int minn = INF ;
for(int i = pre[t] ; i+ ; i = pre[map[i].u])
minn = min(minn,map[i].c-map[i].f) ;
for(int i = pre[t] ; i+ ; i = pre[map[i].u])
{
map[i].f += minn ;
map[i^].f -= minn ;
}
ans += dist[t] ;
}
} void Init()
{
cnt = ;
memset(head,-,sizeof(head)) ;
s = ;
t = *n*n+ ;
del = n*n ;
ans = ;
}
int main()
{
scanf("%d %d",&n,&k) ;
Init() ;
for(int i = ; i <= n ; i++)
{
for(int j = ; j <= n ; j++)
scanf("%d",&cap[i][j]) ;
}
addedge(s,,k,) ;
addedge(n*n+del,t,k,) ;
for(int i = ; i <= n ; i++)
{
for(int j = ; j <= n ; j++)
{
val = (i-)*n+j ;
addedge(val,val+del,,cap[i][j]) ;
addedge(val,val+del,INF,) ;
if(j != n) addedge(val+del,val+,INF,) ;
if(i < n) addedge(val+del,val+n,INF,) ;
}
}
mcmf() ;
printf("%d\n",ans) ;
return ;
}
POJ 3422 Kaka's Matrix Travels(最小费用最大流)的更多相关文章
- [poj] 3422 Kaka's Matrix Travels || 最小费用最大流
原题 给一个N*N的方阵,从[1,1]到[n,n]走K次,走过每个方格加上上面的数,然后这个格上面的数变为0.求可取得的最大的值. 要求最大值,所以把边权全为负跑最小费用即可.因为只有第一次经过该点的 ...
- POJ 3422 Kaka's Matrix Travels(费用流)
Kaka's Matrix Travels Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 6792 Accepted: ...
- POJ 3422 Kaka's Matrix Travels 【最小费用最大流】
题意: 卡卡有一个矩阵,从左上角走到右下角,卡卡每次只能向右或者向下.矩阵里边都是不超过1000的正整数,卡卡走过的元素会变成0,问卡卡可以走k次,问卡卡最多能积累多少和. 思路: 最小费用最大流的题 ...
- POJ 3422 Kaka's Matrix Travels
Kaka's Matrix Travels Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9567 Accepted: ...
- poj3422 Kaka's Matrix Travels(最小费用最大流问题)
/* poj3422 Kaka's Matrix Travels 不知道 k次 dp做为什么不对??? 看了大牛的代码,才知道还可以这样做! 开始没有理解将a 和 a‘ 之间建立怎样的两条边,导致程序 ...
- POJ 3422 Kaka's Matrix Travels (K取方格数:最大费用流)
题意 给出一个n*n大小的矩阵,要求从左上角走到右下角,每次只能向下走或者向右走并取数,某位置取过数之后就只为数值0,现在求解从左上角到右下角走K次的最大值. 思路 经典的费用流模型:K取方格数. 构 ...
- poj 3422 Kaka's Matrix Travels 费用流
题目链接 给一个n*n的矩阵, 从左上角出发, 走到右下角, 然后在返回左上角,这样算两次. 一共重复k次, 每个格子有值, 问能够取得的最大值是多少, 一个格子的值只能取一次, 取完后变为0. 费用 ...
- POJ 3422 Kaka's Matrix Travels(拆点+最大费用流)题解
题意:小A从左上角走到右下角,每个格子都有一个价值,经过这个格子就把价值拿走,每次只能往下或往右走,问你走k次最多能拿多少价值的东西. 思路:这里有一个限制条件就是经过之后要把东西拿走,也就是每一格的 ...
- POJ 3422 Kaka's Matrix Travels K取方格数
题目:给出n*n的方格矩阵,现在从左上方走m次到右下方,问m次能够获得的最大价值和. 分析:最大费用流.拆点进行限制每个格子只取一次,假设点x拆成 x,xx,右边(假设有)y,yy,下方(假设有)z, ...
随机推荐
- 关于post请求参数的大小限制的说明
最近做一个上传图片的项目,前端使用jquery 的post提交,然后把上传的图片的base64码 传到后台,发现几KB或者几十KB的图片,都可以传到后台,但是在上传几M 的图片在后台接收的时候,发现传 ...
- java scoket (UDP通信模型)简易聊天室
import java.net.DatagramPacket; import java.net.DatagramSocket; /** * 接收线程 * * @author xiaoduc * */ ...
- 小学英语课文朗读APP开发笔记(一):创建Win7虚拟机
1 缘起 以小米盒子为代表的OTT机顶盒.智能电视的快速普及,快速推动了Android技术在机顶盒.智能电视领域的普及.既然都是用的Android操作系统,那么从技术上来说应该是大同小异的,当然和手机 ...
- linux下设置mysql数据库字符集utf8
mysql中文乱码解决方法:将mysql数据库编码统一utf8 查看数据库编码: show variables like 'character%'; 编辑/etc/my.cnf [mysql] def ...
- SecureCRT 7 注册码
Name: Sherrill Ray Company: 空 Serial Number:03-40-084141 License Key: ABWGUE ZPPZ6X XHTN2S 1N7PER A ...
- C#+ArcEngine 序列化和反序列化AE对象
http://www.cnblogs.com/jindin/archive/2009/07/23/1529695.html 在AE开发过程,总是要将某些对象暂时存储起来,像element,layer, ...
- vim自动补全:go
1 环境配置 export GOPATH=/home/go 2 在新建GOPATH下新建三个目录 mkdir src pkg bin src 存放源码pkg 存放编译生成的文件bin 存放生成的可执行 ...
- 【html】【17】高级篇--loading加载
参考: http://aspx.sc.chinaz.com/query.aspx?keyword=%E5%8A%A0%E8%BD%BD&classID=835 下载: http://sc. ...
- JavaScript基础-面向对象编程<1>
1.1 函数与对象 1.定义函数的方式定义类 定义类的方法: function class1(){ //类成员的定义及构造函数部分 } class1既是一个函数,也是一个类. 使用 new 操作符获 ...
- 大型B/S系统技术总结(不断更新)
看了<淘宝技术这十年>和<大型网站系统与Java中间件实践>这些书,对大型B/S系统的构建越来越感兴趣,于是尝试收集和总结一些常用的技术手段.不过大型网站的架构是根据业务需求不 ...