/*
poj3422 Kaka's Matrix Travels
不知道 k次 dp做为什么不对???
看了大牛的代码,才知道还可以这样做!
开始没有理解将a 和 a‘ 之间建立怎样的两条边,导致程序一直陷入死循环,真心花了好长时间,快崩溃了。无语.....
题意:有个方阵,每个格子里都有一个非负数,从左上角走到右下角,每次走一步,只能往右或往下走,经过的数字拿走
每次都找可以拿到数字和最大的路径走,走k次,求最大和 这是 最大费用最大流 问题 每次spfa都找的是一条和最大的路径 s--到左上角的边流量是K限制增广次数 求最大费用最大流只需要把费用换成相反数,用最小费用最大流求解即可 构图过程:
每个点拆分成两个 a a' 之间建两条边(当然还要建退边),分别是 (费用为该点相反数,流量为1) (费用为0,流量为k-1)
路过这点时,可以通过前边那条边拿到数字,
以后再从这儿过,就没有数字可拿了,走的就是第二条边 然后是 没点向 右和下 建一条边 费用0,流量k
*/
#include<iostream>
#include<queue>
#include<cstring>
#include<cstdio>
#define N 50000
#define M 5005
#define Max 0x3f3f3f3f
using namespace std;
class EDGE
{
public:
int u, v, c, f;
int next;
};
queue<int>q;
EDGE edge[N];
int cap[][], n, k;
int pre[N], first[N];
int dist[M], vis[M];
int edgeN;
int s, t;
int maxFlow; int spfa()
{
memset(dist, 0x3f, sizeof(dist));
memset(vis, , sizeof(vis));
memset(pre, -, sizeof(pre));
dist[s]=;
q.push(s);
vis[s]=;
while(!q.empty())
{
int u=q.front();
q.pop();
vis[u]=;
for(int e=first[u]; e!=-; e=edge[e].next)
{
int v=edge[e].v;
if(dist[v]>dist[u] + edge[e].c && edge[e].f>)
{
dist[v]=dist[u] + edge[e].c;
pre[v]=e;
if(!vis[v])
{
vis[v]=;
q.push(v);
}
}
}
}
if(dist[t]==Max)
return ;
return ;
} void updateFlow()
{
int minF=Max;
for(int e=pre[t]; e!=-; e=pre[edge[e].u])
if(minF>edge[e].f)
minF=edge[e].f;
for(int e=pre[t]; e!=-; e=pre[edge[e].u])
{
edge[e].f-=minF;
edge[e^].f+=minF;
maxFlow+=minF*edge[e].c;
}
} void adde(int u, int v, int c, int f)
{
edge[edgeN].u=u; edge[edgeN].v=v;
edge[edgeN].c=c; edge[edgeN].f=f;
edge[edgeN].next=first[u]; first[u]=edgeN++; edge[edgeN].u=v; edge[edgeN].v=u;
edge[edgeN].c=-c; edge[edgeN].f=;
edge[edgeN].next=first[v]; first[v]=edgeN++;
} int main()
{
int i, j;
while(scanf("%d%d", &n, &k)!=EOF)
{
maxFlow=;
edgeN=;
memset(first, -, sizeof(first));
s=; t=n*n*+;
for(i=; i<=n; ++i)
for(j=; j<=n; ++j)
scanf("%d", &cap[i][j]);
adde(s, , , k);
for(i=; i<=n; ++i)
for(j=; j<=n; ++j)//n*n个节点,拆点之后变成2*n*n个节点
{
int nb=(i-)*n+j;
adde(*nb-, *nb, -cap[i][j], );//注意:a到a`是建立两条边,但是两条边的费用和容量不一样
adde(*nb-, *nb, , k-);
if(j<n)//向右建图
adde(*nb, *(nb+)-, , k);
if(i<n)//向下建图
adde(*nb, *(nb+n)-, , k);
}
adde(n*n*, t, , k); while(spfa())//建好图之后,直接调用最小费用最大流模板就好了
updateFlow();
printf("%d\n", -maxFlow);
}
return ;
}

poj3422 Kaka's Matrix Travels(最小费用最大流问题)的更多相关文章

  1. POJ3422 Kaka's Matrix Travels 【费用流】*

    POJ3422 Kaka's Matrix Travels Description On an N × N chessboard with a non-negative number in each ...

  2. [poj] 3422 Kaka's Matrix Travels || 最小费用最大流

    原题 给一个N*N的方阵,从[1,1]到[n,n]走K次,走过每个方格加上上面的数,然后这个格上面的数变为0.求可取得的最大的值. 要求最大值,所以把边权全为负跑最小费用即可.因为只有第一次经过该点的 ...

  3. POJ3422 Kaka's Matrix Travels[费用流]

    Kaka's Matrix Travels Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9522   Accepted:  ...

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

    Kaka's Matrix Travels Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6792   Accepted:  ...

  5. POJ3422 Kaka's Matrix Travels

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

  6. POJ 3422 Kaka&#39;s Matrix Travels(费用流)

    POJ 3422 Kaka's Matrix Travels 题目链接 题意:一个矩阵.从左上角往右下角走k趟,每次走过数字就变成0,而且获得这个数字,要求走完之后,所获得数字之和最大 思路:有点类似 ...

  7. POJ 3422 Kaka's Matrix Travels

    Kaka's Matrix Travels Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9567   Accepted:  ...

  8. POJ训练计划3422_Kaka&#39;s Matrix Travels(网络流/费用流)

    解题报告 题目传送门 题意: 从n×n的矩阵的左上角走到右下角,每次仅仅能向右和向下走,走到一个格子上加上格子的数,能够走k次.问最大的和是多少. 思路: 建图:每一个格子掰成两个点,分别叫" ...

  9. POJ 3422 Kaka's Matrix Travels 【最小费用最大流】

    题意: 卡卡有一个矩阵,从左上角走到右下角,卡卡每次只能向右或者向下.矩阵里边都是不超过1000的正整数,卡卡走过的元素会变成0,问卡卡可以走k次,问卡卡最多能积累多少和. 思路: 最小费用最大流的题 ...

随机推荐

  1. [java基础]java跨平台的基础知识

    1.Javac编译器 Javac编译器读取Java源代码,并将其编译成字节代码(.class格式),调用Javac的命令行示例如下: C:>javac options filename.java ...

  2. android开发时使用游标时一定要关闭

    原代码如下: places = getPlaceDatas(context, cursor); cursor.close(); 应改为: try{ places = getPlaceDatas(con ...

  3. Zookeeper初次使用

    下面介绍Linux系统中Zookeeper的初次使用方法. 1.jdk安装和zookeeper下载 首先从jdk官网中下载jdk文件,然后将文件放在/usr/local/java目录下解压,并打开.b ...

  4. WebApi Post提交报错 调试无法进入对应action函数

    调试发现有长内容或者是特殊字符就报错,确定是服务端验证的问题 需要 在配置文件 <system.web> 中添加<httpRuntime  requestValidationMode ...

  5. 一个老菜鸟所理解的UX及产品流

    从事前端开发到目前为止已经有4年多的时间了,从一个小菜鸟一路依靠自学,到目前总算一个老菜鸟了.当然了,从事前端的工作,是免不了要对产品以及用户体验有些许了解的.最近谈论起这方面的内容,就按照自己的想法 ...

  6. Git Day02,工作区,暂存区,回退,删除文件

    1st,工作区回退:2st,暂存区回退:3rd,删除文件:

  7. Java Socket Server的演进 (一)

    最近在看一些网络服务器的设计, 本文就从起源的角度介绍一下现代网络服务器处理并发连接的思路, 例子就用java提供的API. 1.单线程同步阻塞式服务器及操作系统API 此种是最简单的socket服务 ...

  8. scp命令[转]

    scp是secure copy的简写,用于在Linux下进行远程拷贝文件的命令,和它类似的命令有cp,不过cp只是在本机进行拷贝不能跨服务器,而且scp传输是加密的.可能会稍微影响一下速度.当你服务器 ...

  9. Oracle Redo 以及 Archived日志简述

    Oracle通过Redo Archived实现数据的归档 什么是Redo日志 Redo日志记录了数据的变更,用于在数据库出现故障后,进行数据恢复. 功能主要由三个组件实现:Redo Log Buffe ...

  10. H5常用代码:适配方案5

    此方案跟方案4是同一原理,也是通过REM实现的,能单独归类出一个方案,是因为它有一定的实用价值,当你遇到追求完美,追求到一像素的UI或者产品时,那此方案将解决你的困境. 方案5主要是用来解决一像素边框 ...