解题报告

题目传送门

题意:

从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. 【NOIP 2002】 字串变换

    [题目链接] https://www.luogu.org/problemnew/show/P1032 [算法] 广度优先搜索 用stl库里的map来判重 [代码] #include<bits/s ...

  2. 2017-3-10 leetcode 229 238 268

    今天登陆leetcode突然发现531被锁了,有种占了便宜的感觉哈哈哈! ================================================ leetcode229 Ma ...

  3. 大数据攻城狮之Linux基础------rpm软件管理

    rpm的英文名称为: Redhat package manager 常用的命令加组合: i 安装 rpm -ivh 软件包名 当然我们的rpm也可以支持多包同时操作 rpm -ivh 软件包1 软件包 ...

  4. java中的数组的Arrays工具类的使用

    package day04.d1.shuzu; import java.util.Arrays; /** * Arrays 工具类 * @author Administrator * */public ...

  5. Struts2的学习链接

    ---- Struts2的学习途径 (downpour) http://www.iteye.com/wiki/struts2/1306-struts2-way-of-learning ---- Str ...

  6. css中max-width和min-width的应用

    max-width:从字面意思可以看出,是规定元素本身最大宽度,元素本身宽度应小于等于最大宽度值. min-width:从字面意思可以看出,是规定元素本身最小宽度,元素本身宽度应大于等于最小宽度值. ...

  7. BZOJ2134: 单选错位(期望乱搞)

    Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 1101  Solved: 851[Submit][Status][Discuss] Descripti ...

  8. 读《我是一只 IT 小小鸟》

    读<我是一只 IT 小小鸟> 作为一个一向看重节操的体面人,即使面临许多 DDL 包括期中考试,在忙乱不堪的时候我也断不断告诫自己,不能迫于课程要求仅为了写出一篇笔记而去读书,以后更是如此 ...

  9. [ Java ] [ JUnit ] [ Eclipse ] coverage

    官方資訊: https://www.eclemma.org/ - 簡短使用範例說明: https://dzone.com/articles/java-code-coverage-in-eclipse ...

  10. vs添加浏览器

    点击桌面谷歌图标,查看属性,赋值全部地址 在vs中,直接添加,把地址复制进去就ok了