解题报告

题目传送门

题意:

从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. CH Round #46A 磁力块

    还是一道好题的 对于一个磁石是否被吸引,有两个关键字:距离和质量.(二维偏序??) 好像是很厉害的分块姿势,先按第一关键字排序,在块中按第二关键字排 进行bfs,对于当前磁石,有1~k-1个块是第一关 ...

  2. Linux - 控制台界面,虚拟界面,字符界面

    tty控制台终端. pts虚拟终端. tty1 图形界面. tty2 字符界面. Ctrl+Alt+F2-6 在字符界面下,通过Alt+F2 切换回来.或者切换到其他的字符界面. Alt+F2 pts ...

  3. Orcal的JDBC数据连接方式

    package cn.com.db; import java.sql.Connection; import java.sql.DriverManager; import java.sql.Prepar ...

  4. Arduino-OLED-四度显示

    double Fahrenheit(double celsius) { ; } //摄氏温度度转化为华氏温度 double Kelvin(double celsius) { return celsiu ...

  5. javascript中五句话

    1.弹出框 ,小括号中就是弹出的内容 alert("我是一个弹出框");   2.控制台输出 小括号里面就是 控制台输出的东西 console.log("我是控制台输出的 ...

  6. javaEE_maven_struts2_tomcat_first

    1 .eclipse中新建项目

  7. 莫烦大大TensorFlow学习笔记(9)----可视化

      一.Matplotlib[结果可视化] #import os #os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2' import tensorflow as tf i ...

  8. class一些内置方法

    一. __getattribute__ class Foo: def __init__(self,x): self.x=x def __getattr__(self, item): print('执行 ...

  9. Vue JsonView 树形格式化代码插件

     组件代码(临时粘出来) <template> <div class="bgView"> <div :class="['json-view' ...

  10. Bind for 0.0.0.0:80 failed: port is already allocated.解决方案

    一句话总结就是容器占用的port还没有完全释放 查看进程,发现相关的容器并没有在运行,而 docker-proxy 却依然绑定着端口: $ docker ps 检查docker镜像 $ ps -aux ...