解题报告

题目传送门

题意:

从n×n的矩阵的左上角走到右下角,每次仅仅能向右和向下走,走到一个格子上加上格子的数,能够走k次。问最大的和是多少。

思路:

建图:每一个格子掰成两个点,分别叫“出点”,“入点”,
入点到出点间连一个容量1。费用为格子数的边。以及一个容量∞,费用0的边。
同一时候。一个格子的“出点”向它右、下的格子的“入点”连边。容量∞,费用0。
源点向(0,0)的入点连一个容量K的边。(N-1,N-1)的出点向汇点连一个容量inf的边。
#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
#define inf 0x3f3f3f3f
using namespace std;
struct node {
int v,cost,cap,next;
} edge[101000];
int head[10000],dis[10000],pre[10000],vis[10000],f[10000],mmap[100][100],cnt,s,t,n,m,k,flow,cost;
void add(int u,int v,int cost,int cap) {
edge[cnt].v=v;
edge[cnt].cost=cost;
edge[cnt].cap=cap;
edge[cnt].next=head[u];
head[u]=cnt++;
edge[cnt].v=u;
edge[cnt].cost=-cost;
edge[cnt].cap=0;
edge[cnt].next=head[v];
head[v]=cnt++;
}
int _spfa() {
for(int i=s; i<=t; i++) {
dis[i]=-1;
pre[i]=f[i]=vis[i]=0;
}
dis[s]=0;
f[s]=inf;
pre[s]=-1;
vis[s]=1;
queue<int>Q;
Q.push(s);
while(!Q.empty()) {
int u=Q.front();
Q.pop();
vis[u]=0;
for(int i=head[u]; i!=-1; i=edge[i].next) {
int v=edge[i].v;
if(edge[i].cap&&dis[v]<dis[u]+edge[i].cost) {
dis[v]=dis[u]+edge[i].cost;
f[v]=min(f[u],edge[i].cap);
pre[v]=i;
if(!vis[v]) {
vis[v]=1;
Q.push(v);
}
}
}
}
if(dis[t]==-1)return 0;
cost+=dis[t];
flow+=f[t];
for(int i=pre[t]; i!=-1; i=pre[edge[i^1].v]) {
edge[i].cap-=f[t];
edge[i^1].cap+=f[t];
}
return 1;
}
void mcmf() {
cost=flow=0;
while(_spfa());
printf("%d\n",cost);
}
int dx[]= {0,1};
int dy[]= {1,0};
int main() {
int i,j;
scanf("%d%d",&n,&k);
memset(head,-1,sizeof(head));
cnt=0;
m=n*n;
s=0;
t=2*m+1;
for(i=0; i<n; i++) {
for(j=0; j<n; j++) {
scanf("%d",&mmap[i][j]);
}
}
add(s,1,0,k);
for(i=0; i<n; i++) {
for(j=0; j<n; j++) {
add(i*n+j+1,m+i*n+j+1,mmap[i][j],1);
add(i*n+j+1,m+i*n+j+1,0,inf);
for(int l=0; l<2; l++) {
int x=i+dx[l];
int y=j+dy[l];
if(x>=0&&x<n&&y>=0&&y<n) {
add(m+i*n+j+1,x*n+y+1,0,inf);
}
}
}
}
add(2*m,t,0,inf);
mcmf();
return 0;
}

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

Description

On an N × N chessboard with a non-negative number in each grid, Kaka starts his matrix travels with SUM = 0. For each travel, Kaka moves one rook from the left-upper grid to the right-bottom one, taking care that the rook moves
only to the right or down. Kaka adds the number to SUM in each grid the rook visited, and replaces it with zero. It is not difficult to know the maximum SUM Kaka can obtain for his first travel. Now Kaka is wondering what is the maximum SUM he
can obtain after his Kth travel. Note the SUM is accumulative during the K travels.

Input

The first line contains two integers N and K (1 ≤ N ≤ 50, 0 ≤ K ≤ 10) described above. The following N lines represents the matrix. You can assume the numbers in the matrix are no more than 1000.

Output

The maximum SUM Kaka can obtain after his Kth travel.

Sample Input

3 2
1 2 3
0 2 1
1 4 2

Sample Output

15

POJ训练计划3422_Kaka&#39;s Matrix Travels(网络流/费用流)的更多相关文章

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

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

  2. POJ 3422 Kaka&#39;s Matrix Travels (最小费用最大流)

    POJ 3422 Kaka's Matrix Travels 链接:http://poj.org/problem? id=3422 题意:有一个N*N的方格,每一个方格里面有一个数字.如今卡卡要从左上 ...

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

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

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

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

  5. poj Kaka&#39;s Matrix Travels

    Kaka's Matrix Travels 题目: 给出一个矩阵.求仅仅能向下或者向右的情况下能得到的最大和.一般的是指遍历一次,而这个是能够反复走K次.每经过一次后就把该点设为0.求最大和. 算法: ...

  6. POJ3422 Kaka&#39;s Matrix Travels 【最大费用最大流】

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

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

    /* poj3422 Kaka's Matrix Travels 不知道 k次 dp做为什么不对??? 看了大牛的代码,才知道还可以这样做! 开始没有理解将a 和 a‘ 之间建立怎样的两条边,导致程序 ...

  8. 图论--网络流--费用流--POJ 2156 Minimum Cost

    Description Dearboy, a goods victualer, now comes to a big problem, and he needs your help. In his s ...

  9. BZOJ2055 80人环游世界 网络流 费用流 有源汇有上下界的费用流

    https://darkbzoj.cf/problem/2055 https://blog.csdn.net/Clove_unique/article/details/54864211 ←对有上下界费 ...

随机推荐

  1. package-org.springframework.ui-interface:Model.class

    ylbtech-package-org.springframework.ui-interface:Model.class 1.返回顶部 1. /* * Copyright 2002-2012 the ...

  2. @synthesize和@dynamic区别

    在声明property属性后,有2种实现选择 @synthesize 编译器期间,让编译器自动生成getter/setter方法. 当有自定义的存或取方法时,自定义会屏蔽自动生成该方法 @dynami ...

  3. SNMP简单概述

    一.SNMP简单概述 1.1.什么是Snmp SNMP是英文"Simple Network Management Protocol"的缩写,中文意思是"简单网络管理协议& ...

  4. [XJOI]noip43 T2多人背包

    多人背包 DD 和好朋友们要去爬山啦!他们一共有 K 个人,每个人都会背一个包.这些包的容量是相同的,都是 V.可以装进背包里的一共有 N 种物品,每种物品都有给定的体积和价值.在 DD 看来,合理的 ...

  5. C++数字图像处理(1)-伽马变换

    https://blog.csdn.net/huqiang_823/article/details/80767019 1.算法原理    伽马变换(幂律变换)是常用的灰度变换,是一种简单的图像增强算法 ...

  6. Hadoop MapReduce编程 API入门系列之倒排索引(二十四)

    不多说,直接上代码. 2016-12-12 21:54:04,509 INFO [org.apache.hadoop.metrics.jvm.JvmMetrics] - Initializing JV ...

  7. 兼容各个浏览器的jquyer zclip复制文本插件 无效的解决办法

    项目中使用点击文本复制功能,用了这个兼容各个浏览器的插件,但是发现放在最前面正常,放到嵌套的html中就失效. 解决办法: <span style="position: relativ ...

  8. 大白话理解this

    日常开发中,我们经常用到this.一开始常会用一种感觉去判断this的指向,当遇到复杂的函数调用时,就分不清this的指向. 今天我们来由浅入深来学习下. function family1(){ va ...

  9. sql中数据库连接与断开式连接有什么区别?

    连接式指的是对数据的操作在 conn.Open() 与 conn.Close()之间: 断开式连接指的是 conn.Open()打开连接之后,先将数据放入adapter中,然后关闭连接(conn.Cl ...

  10. Java数组的运用

    Java数组 应用1: 大乐透彩票模拟器: 规则: 前区01-35中随机生成5个号码 后区01-12中随机生成2个号码 模拟操作,系统自动生成号码组合,并且按从小到大的顺序输出结果 同时要求可以选择生 ...