问题 D: 探 寻 宝 藏

时间限制: 1 Sec  内存限制: 128 MB

题目描述

传说HMH大沙漠中有一个M*N迷宫,里面藏有许多宝物。某天,Dr.Kong找到了迷宫的地图,他发现迷宫内处处有宝物,最珍贵的宝物就藏在右下角,迷宫的进出口在左上角。当然,迷宫中的通路不是平坦的,到处都是陷阱。Dr.Kong决定让他的机器人卡多去探险。

但机器人卡多从左上角走到右下角时,只会向下走或者向右走。从右下角往回走到左上角时,只会向上走或者向左走,而且卡多不走回头路。(即:一个点最多经过一次)。当然卡多顺手也拿走沿路的每个宝物。

Dr.Kong希望他的机器人卡多尽量多地带出宝物。请你编写程序,帮助Dr.Kong计算一下,卡多最多能带出多少宝物。

输入

第一行: K     表示有多少组测试数据。

接下来对每组测试数据:

第1行:       M   N

第2~M+1行: Ai1  Ai2 ……AiN    (i=1,…..,m)

2≤k≤5      1≤M, N≤50     0≤Aij≤100    (i=1,….,M; j=1,…,N)

所有数据都是整数。 数据之间有一个空格。

输出

对于每组测试数据,输出一行:机器人卡多携带出最多价值的宝物数

样例输入

2
2 3
0 10 10
10 10 80
3 3
0 3 9
2 8 5
5 7 100

样例输出

120
134

//直接最小费用最大流模板~

代码如下:

#include "stdio.h"
#include "string.h"
#include "queue"
using namespace std; #define N 5005
#define INF 0x3fffffff struct node
{
int u,v;
int w,k;
int next;
}edge[10*N];
int idx,head[N]; void Init(){ idx=0; memset(head,-1,sizeof(head)); } void Addedge(int x,int y,int w,int k)
{
edge[idx].u=x; edge[idx].v=y;
edge[idx].w=w; edge[idx].k=k;
edge[idx].next = head[x];
head[x] = idx++;
}
void Add(int x,int y,int w,int k)
{
Addedge(x,y,w,k);
Addedge(y,x,-w,0);
} int ans;
bool mark[N];
int dis[N],route[N]; void SPFA_Init(int start,int end)
{
for(int i=0; i<=end; ++i)
dis[i] = INF;
memset(mark,false,sizeof(mark));
memset(route,-1,sizeof(route));
dis[start] = 0;
mark[start] = true;
} int SPFA(int start,int end)
{
int i;
int x,y;
SPFA_Init(start,end);
queue<int> q;
q.push(start);
while(!q.empty())
{
x = q.front();
q.pop();
for(i=head[x]; i!=-1; i=edge[i].next)
{
y = edge[i].v;
if(edge[i].k && dis[y]>dis[x]+edge[i].w)
{
dis[y]=dis[x]+edge[i].w;
route[y] = i;
if(!mark[y])
{
mark[y]=true;
q.push(y);
}
}
}
mark[x]=false;
}
if(route[end]==-1) return 0;
return 1;
} void EK(int start,int end)
{
int x,y;
y=route[end];
while(y!=-1)
{
x = y^1;
edge[y].k--;
edge[x].k++;
ans += edge[y].w;
y = route[edge[y].u];
}
} int main()
{
int T;
int m,n;
int i,j;
int x,k,w;
int start,end;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&m,&n);
Init();
k = n*m;
start = 0;
end = 2*n*m+1;
Add(start,1,0,2); //起点start和点1建两条边
Add(1,k+1,0,1); //点1和点k+1再加一条边
for(i=1; i<=m; ++i)
{
for(j=1; j<=n; ++j)
{
x = j+(i-1)*n;
scanf("%d",&w);
Add(x,x+k,-w,1); //题目要求最大值,故取反
if(i!=m) Add(x+k,x+n,0,INF);
if(j!=n) Add(x+k,x+1,0,INF);
}
}
Add(2*k,end,0,2); //终点end和点2*k建两条边
Add(k,2*k,0,1); //点k和点2*k再加一条边
ans = 0;
while(SPFA(start,end)) //最小费用最大流算法
EK(start,end);
printf("%d\n",-ans);
}
return 0;
}

nyoj 712 探 寻 宝 藏--最小费用最大流的更多相关文章

  1. nyist 61 传纸条 nyist 712 探 寻 宝 藏(双线程dp问题)

    http://acm.nyist.net/JudgeOnline/problem.php?pid=61 http://acm.nyist.net/JudgeOnline/problem.php?pid ...

  2. 探 寻 宝 藏--- DP

    题目描述 传说HMH大沙漠中有一个M*N迷宫,里面藏有许多宝物.某天,Dr.Kong找到了迷宫的地图,他发现迷宫内处处有宝物,最珍贵的宝物就藏在右下角,迷宫的进出口在左上角.当然,迷宫中的通路不是平坦 ...

  3. POJ 2135 Farm Tour (网络流,最小费用最大流)

    POJ 2135 Farm Tour (网络流,最小费用最大流) Description When FJ's friends visit him on the farm, he likes to sh ...

  4. [板子]最小费用最大流(Dijkstra增广)

    最小费用最大流板子,没有压行.利用重标号让边权非负,用Dijkstra进行增广,在理论和实际上都比SPFA增广快得多.教程略去.转载请随意. #include <cstdio> #incl ...

  5. bzoj1927最小费用最大流

    其实本来打算做最小费用最大流的题目前先来点模板题的,,,结果看到这道题二话不说(之前打太多了)敲了一个dinic,快写完了发现不对 我当时就这表情→   =_=你TM逗我 刚要删突然感觉dinic的模 ...

  6. ACM/ICPC 之 卡卡的矩阵旅行-最小费用最大流(可做模板)(POJ3422)

    将每个点拆分成原点A与伪点B,A->B有两条单向路(邻接表实现时需要建立一条反向的空边,并保证环路费用和为0),一条残留容量为1,费用为本身的负值(便于计算最短路),另一条残留容量+∞,费用为0 ...

  7. HDU5900 QSC and Master(区间DP + 最小费用最大流)

    题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=5900 Description Every school has some legends, ...

  8. P3381 【模板】最小费用最大流

    P3381 [模板]最小费用最大流 题目描述 如题,给出一个网络图,以及其源点和汇点,每条边已知其最大流量和单位流量费用,求出其网络最大流和在最大流情况下的最小费用. 输入输出格式 输入格式: 第一行 ...

  9. 【BZOJ-3876】支线剧情 有上下界的网络流(有下界有源有汇最小费用最大流)

    3876: [Ahoi2014]支线剧情 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 821  Solved: 502[Submit][Status ...

随机推荐

  1. AEAI WM V1.0 工作管理系统开源发版

    AEAI WM工作管理系统是沈阳数通畅联软件公司基于AEAI DP平台开发的开源Java Web系统,用来管理记录日常工作内容及周工作内容等事务,AEAI WM工作管理系统包括一些核心的工作管理业务功 ...

  2. Unity Shader入门基础(一)

    渲染流水线   一.渲染流水线 渲染流水线的工作任务在于由一个三维场景出发.生存(或者说渲染)一张二维图像.换句话说,计算机需要从一系列的顶点数据.纹理等信息出发,把这些信息最终转换成一张人眼可以看到 ...

  3. csharp: Procedure with DAO(Data Access Object) and DAL(Data Access Layer)

    sql script code: CREATE TABLE DuCardType ( CardTypeId INT IDENTITY(1,1) PRIMARY KEY, CardTypeName NV ...

  4. JPHP试用笔记

    JPHP试用指南 编译 环境准备 有JDK 1.6 的环境 Gradle 1.4 以上 具体配置略过,git签出https://github.com/dim-s/jphp/代码后,看readme.md ...

  5. 关于我的OI生涯(AFO){NOIP2016 后}

    这篇我就随意写啦~不用统一的“题解”形式.♪(^∀^●)ノ 也分好几次慢慢更吧~ 对于NOIP2016的总结,我本想善始善终back回,但是心情不足以支撑我,那就只能有始有终了......下面进入我的 ...

  6. Hibernate中的一对一关联和组件的映射

    Hibernate提供了两种映射一对一映射关联关系的方式: 01.按照外键映射 02.按照主键映射 下面以员工账号表和员工档案表(员工账号和档案表之间是一对一的关系)为例,介绍这两种映射关系,并使用这 ...

  7. 研究jdk关于TreeMap 红黑树算法实现

    因为TreeMap的实现方式是用红黑树这种数据结构进行存储的,所以呢我主要通过分析红黑树的实现在看待TreeMap,侧重点也在于如何实现红黑树,因为网上已经有非常都的关于红黑树的实现.我也看了些,但是 ...

  8. NTFS碎片

    在Windows操作系统中查看各分区的文件系统: fsutil fsinfo ntfsinfo c: (查看C:盘的文件系统) fsutil fsinfo ntfsinfo d: (查看D:盘的文件系 ...

  9. mysql root用户kill connection报ERROR 1095 (HY000): You are not owner of thread N

    今日某系统mysql root用户kill connection时报ERROR 1095 (HY000): You are not owner of thread N 按说通过root用户具有supe ...

  10. CSS属性选择器温故-4

    1.属性选择器就是通过元素属性来找到元素 2.属性选择器语法 CSS3遵循了惯用的编码规则,通配符的使用提高了样式表的书写效率,也使CSS3的属性选择器更符合编码习惯 3.浏览器兼容性 CSS选择器总 ...