Let‘s play computer game(最短路 + dfs找出所有确定长度的最短路)
Description
xxxxxxxxx在疫情期间迷上了一款游戏,这个游戏一共有nnn个地点(编号为1——n1——n1——n),他每次从一个地点移动到另外一个地点需要消耗
一定的能量,每一个地点都有一些珠宝,输入中会把每一个地方的珠宝价值估算成一个值。
xxxxxxxxx想请聪明的你帮他找出来从编号为sss的地点,到编号为ddd的地点最小要消耗多少能量,消耗这些能量最多获得多少价值的珠宝
Input
第一行输入n,s,dn,s,dn,s,d。其意义如上描述 (n<520n<520n<520)
第二行有nnn个数XiX_iXi,比如i==1i==1i==1描述编号为1的点有珠宝价值为XiX_iXi(这里保证XiX_iXi大于等于0) (Xi<1000X_i<1000Xi<1000)
下面输入一个n∗nn*nn∗n的矩阵,比如第iii行,第j列的值为xxx,就表示从编号为iii到编号为jjj的地方距离为x (x<1000)x (x<1000)x (x<1000)(这里保证xxx大于等于0)
注意:这是一个单向路,即从编号为iii到编号为jjj的距离可能不等于从编号为jjj到编号为iii
Output
输出占一行,第一个数是最小要消耗多少能量,第二个数是消耗这些能量最多获得多少价值的珠宝。两个数用空格分开
Hint
第一个样例解释:
解释:
把这个矩阵翻译成边
1->2 1
2->4 2
1->4 3
1->3 2
3->4 2
正确路径:1->2->4
后面的就不用说了吧^_^
Source
qmh
思路
题意:一个人从 s出发到 点e,在所给的图中每个 点 就有个一个珠宝(价值会给我们的) ,在消耗能量最少(即:最短路)的基础上 求出能得到最大珠宝总价值是多少
思路:先用 Dijkstra 或者 Spfa 来求一下从 s -> e 的最短路的距离, 有了这个最短距离之后,那么我们可以用 dfs 去深搜没一条路径,找到 在所有符合最短路的路径中 价值最大的那条的价值,
注意:我们在dfs的时候是可以做优化的,让我们来看看代码中的这一段 dis[i] == dis[j] + Grf[j][i] , dis表示的是从 s 点出发到 i 点的最短距离 Grf 是存图的临接矩阵,如果上述的 等式不成立,那么我们我们就可以不用往下递归了,因为当前走的这条路已经不可能在符合题意了,解释:假设又一条路:s -> 1 -> j -> i -> 3 -> e. | Grf[j][i] 表示从j 到 i 的距离,如果 从s 点出发到 i的距离不等于 从s出发到 dis[i] 的最短路的距离,那么它一定不可能是我们所找的最短路径,,,自己在思考思考吧
代码
#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
#define INF 0x3f3f3f3f
const int Len = 550;
int Grf[Len][Len];
int dis[Len];
int n, s, e;
int val[Len];
int Dijkstra(int s, int e)
{
int vis[Len];
for(int i = 1; i <= n; i ++)
vis[i] = 0, dis[i] = Grf[s][i];
vis[s] = 1;
for(int i = 1; i <= n; i ++)
{
int mn = INF;
for(int i = 1; i <= n; i ++) //1. 在这个集合中选择与该集合相连的最小权值的那条边的点
{
if(! vis[i] && dis[i] < mn)
{
mn = dis[i];
s = i;
}
}
//2. 把新加入的这个点做上标记
vis[s] = 1;
//3. 更新与这个点相连的边的点 dis 距离(因为在集合中的距离已经确定是最短距离,而我们在新加入这个点之后,我们可以更新与这个点相连的点(这个点是在集合外的点)的最短距离)
for(int i = 1; i <= n; i ++)
if(dis[s] + Grf[s][i] < dis[i])
dis[i] = dis[s] + Grf[s][i];
}
return dis[e];
}
int res = -1;
int mrk[Len];
void dfs(int mn_dis, int pri, int s, int e)
{
if(s == e)
{
if(res < pri)
res = pri;
return;
}
for(int i = 1; i <= n; i ++)
{
if(! mrk[i] && dis[i] == dis[s] + Grf[s][i]) //这里的 dis[i] == dis[s] + Grf[s][i] 优化避免了盲目 搜索所有路径,假设有一条路径:s -> 2 -> 3 -> e , 如果dis[3] 不等于我们dfs过程到节点3的路径长度,那么就算dfs递归到了终点,这条路径的长度也绝对不可能等于dis[e]
{
mrk[i] = 1;
dfs(mn_dis, pri + val[i], i, e);
mrk[i] = 0;
}
}
}
int main()
{
//freopen("A.txt","r",stdin);
int tem;
scanf("%d %d %d", &n, &s, &e);
for(int i = 1; i <= n; i ++)
scanf("%d", &val[i]);
for(int i = 1; i <= n; i ++)
for(int j = 1; j <= n; j ++)
scanf("%d", &tem), Grf[i][j] = tem;
int mn_dis = Dijkstra(s, e);
dfs(mn_dis, 0, s, e);
printf("%d %d\n", dis[e], res);
return 0;
}
Let‘s play computer game(最短路 + dfs找出所有确定长度的最短路)的更多相关文章
- hdu 1595 find the longest of the shortest【最短路枚举删边求删除每条边后的最短路,并从这些最短路中找出最长的那条】
find the longest of the shortest Time Limit: 1000/5000 MS (Java/Others) Memory Limit: 32768/32768 ...
- PAT-1018(Public Bike Management)最短路+额外条件+所有最短路中找出满足条件的路径+dijkstra算法
Public Bike Management PAT-1018 使用一个vector来存储所有最短路的前驱结点,再通过使用dfs和一个额外的vector记录每一条路径 #include<iost ...
- hdu1298 T9(手机输入法,每按一个数字,找出出现频率最高的字串,字典树+DFS)
Problem Description A while ago it was quite cumbersome to create a message for the Short Message Se ...
- 题目1539:师弟 ——最短路+DFS
题意::从起点到终点的所有的最短路中,找出离终点有X个路口的城市一共有几个 开始我用最短路+DFS从起点开始搜,超时了 换了一种方法,从终点开始搜,AC #include<stdio.h> ...
- ZOJ 3781 Paint the Grid Reloaded(DFS连通块缩点+BFS求最短路)
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5268 题目大意:字符一样并且相邻的即为连通.每次可翻转一个连通块X( ...
- DFS应用——找出无向图的割点
[0]README 0.1) 本文总结于 数据结构与算法分析, 源代码均为原创, 旨在 理解 "DFS应用于找割点" 的idea 并用源代码加以实现: 0.2) 必须要事先 做个s ...
- CodeForces - 103B(思维+dfs找环)
题意 https://vjudge.net/problem/CodeForces-103B 很久很久以前的一天,一位美男子来到海边,海上狂风大作.美男子希望在海中找到美人鱼 ,但是很不幸他只找到了章鱼 ...
- # 「银联初赛第一场」自学图论的码队弟弟(dfs找环+巧解n个二元一次方程)
「银联初赛第一场」自学图论的码队弟弟(dfs找环+巧解n个二元一次方程) 题链 题意:n条边n个节点的连通图,边权为两个节点的权值之和,没有「自环」或「重边」,给出的图中有且只有一个包括奇数个结点的环 ...
- [蓝桥杯2018初赛]小朋友崇拜圈(dfs找环)
传送门 思路: 题意大意:n条有向边,找出最大环. 我们发现,如果一个小朋友没有被任何人崇拜,那么他一定不位于环中.为此我们可以设置一个indug数组预处理.如果2被崇拜了那么indug[2]就加加, ...
随机推荐
- VMWare12pro安装Centos 6.9教程
VMWare下Centos 6.9安装教程,记录如下 1.新建虚拟机 (1)点击文件-->新建虚拟机 (2)选择 自定义(高级)-->下一步 (3)选择Workstation 12.0-- ...
- 关于javascript 的reduce方法
作为一个前端菜鸟,觉得资料比较好,特地分享一下~~ reduce() 方法接收一个函数作为累加器(accumulator),数组中的每个值(从左到右)开始缩减,最终为一个值. 你一定也和我一样看的有点 ...
- GPS授时器简介
GPS授时器简介 GPS是全球定位系统的简称.GPS定位卫星在全球范围内进行定位.导航的系统.GPS所具有的全天候.高精度和自动测量的特点,已经融入到国民经济建设.国防建设和社会发展的各个领域.而在授 ...
- [C++入门篇]了解C++
前言 我是杨某人,点击右下方"+"一键关注我.如果你喜欢我的文章,那么拒绝白嫖行为.然后..请多来做客鸭. 如果你是已经入门的大佬,请滑到下方点个推荐再走. 我个人认为,博客有两种 ...
- vs远程调试iis
1.在开发电脑上 找到 D:\Software\VS2010\Common7\IDE\Remote Debugger 下面msvsmon.exe所在的两个文件夹x86和x64,使用x86或者x64是根 ...
- 2019-分享数百个 HT 工业互联网 2D 3D 可视化应用案例分享
继<分享数百个 HT 工业互联网 2D 3D 可视化应用案例>2018 篇,图扑软件定义 2018 为国内工业互联网可视化的元年后,2019 年里我们与各行业客户进行了更深度合作,拓展了H ...
- Spring中的JdbcTemplate的使用
一.jdbcTemplate的作用 它就是用于和数据库交互的,实现对表的crud.与dbutils相似 二.JdbcTemplate的使用 <dependency> <groupId ...
- 题解 NOI1999【生日蛋糕】—— 洛谷
自己想出这题的大佬蒟蒻在这儿%您了 我实在是太弱了,搜索这种辣鸡算法都不会(逃 这题真的是想了好久,每次都会T三个点,我以为我的剪枝已经堆了够多了,结果后来才知道是一个关键剪枝没想到OTZ 先贴代码 ...
- liunx 安装 zookeeper(转)
转自:https://www.cnblogs.com/expiator/p/9853378.html linux安装zookeeper及使用 一.安装条件 想要安装zookeeper,必须先在linu ...
- 小白学 Python 数据分析(18):Matplotlib(三)常用图表(上)
人生苦短,我用 Python 前文传送门: 小白学 Python 数据分析(1):数据分析基础 小白学 Python 数据分析(2):Pandas (一)概述 小白学 Python 数据分析(3):P ...