51nod1459迷宫问题—(迪杰斯特拉)
第一行4个整数n (<=500), m, start, end。n表示房间的个数,房间编号从0到(n - 1),m表示道路数,任意两个房间之间最多只有一条道路,start和end表示起点和终点房间的编号。
第二行包含n个空格分隔的正整数(不超过600),表示进入每个房间你的得分。
再接下来m行,每行3个空格分隔的整数x, y, z (0<z<=200)表示道路,表示从房间x到房间y(双向)的道路,注意,最多只有一条道路连结两个房间, 你需要的时间为z。
输入保证从start到end至少有一条路径。
一行,两个空格分隔的整数,第一个表示你最少需要的时间,第二个表示你在最少时间前提下可以获得的最大得分。
3 2 0 2
1 2 3
0 1 10
1 2 11
21 6 题意:中文题。。。。。。 思路:迪杰斯特拉求最短路。但与模板不同,这里添加了分值这一个变量。所以,如果遇见了两条一样长的路,则取能够获得的分值较高的那一条。 代码:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<string>
#include<cmath>
#include<algorithm>
#include<stack>
#include<climits>
#include<queue>
#define eps 1e-7
#define ll long long
#define inf 0x3f3f3f3f
#define pi 3.141592653589793238462643383279
using namespace std;
struct node{
int far,mark;
}; int map[][],visit[],value[]; void Dijkstra(int start,int end,int n)
{
node d[];
for(int i=; i<n; ++i)
{
d[i].mark = value[i];//初始化起点到达每个点的分值为这个点输入的分值
d[i].far = map[start][i];
}
visit[start] = ; int Min,flag,num = n;
while(--num)
{
Min = inf;
for(int i=; i<n; ++i)
{
if(!visit[i] && d[i].far < Min) //找出没走过的点中,起点能到达的最近的点
{
Min = d[i].far;
flag = i;
}
} visit[flag] = ; for(int j=; j<n; ++j) //更新路径
{
if(!visit[j])
{
if(map[flag][j] + d[flag].far < d[j].far) //如果起点到 j 的距离比通过flag到 j 的距离长
{ //就更新d[j]的长度为通过flag到 j 的长度
d[j].far = map[flag][j] + d[flag].far;
d[j].mark = d[flag].mark + value[j];
}
else if(map[flag][j] + d[flag].far == d[j].far) //一样长就取分值较大的
{
d[j].mark = max(d[flag].mark + value[j], d[j].mark);
}
}
}
}
if(start == end)
cout<<d[end].far<<' '<<d[end].mark<<endl;
else
cout<<d[end].far<<' '<<d[end].mark + value[start]<<endl;
} int main()
{
int n,m,start,end;
while(cin>>n>>m>>start>>end)
{
for(int i=; i<n; ++i) //初始化两点之间的距离为无穷大,自己到自己为0
for(int j=; j<n; ++j)
{
if(i == j)
map[i][j] = map[j][i] = ;
else
map[i][j] = map[j][i] = inf;
} memset(visit,,sizeof(visit)); for(int i=; i<n; ++i)
scanf("%d",&value[i]); int a,b,weight;
for(int i=; i<m; ++i)
{
scanf("%d%d%d",&a,&b,&weight);
if(map[a][b] > weight)
map[a][b] = map[b][a] = weight;
}
Dijkstra(start,end,n);
}
return ;
}
51nod1459迷宫问题—(迪杰斯特拉)的更多相关文章
- 最短路径之迪杰斯特拉(Dijkstra)算法
迪杰斯特拉(Dijkstra)算法主要是针对没有负值的有向图,求解其中的单一起点到其他顶点的最短路径算法.本文主要总结迪杰斯特拉(Dijkstra)算法的原理和算法流程,最后通过程序实现在一个带权值的 ...
- C#迪杰斯特拉算法
C#迪杰斯特拉算法 网上有许多版本的,自己还是写一个理解点 Dijkstra.cs public class Dijkstra { private List<Node> _nodes; p ...
- C++迪杰斯特拉算法求最短路径
一:算法历史 迪杰斯特拉算法是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题.迪杰斯特拉算法主要特点是以 ...
- 【算法杂谈】LJX的迪杰斯特拉算法报告
迪杰斯特拉(di jie qi)算法 这里有一张图: 假设要求从1号节点到5号节点的最短路.那么根据迪杰斯特拉算法的思想,我们先看: 节点1,从节点1出发的一共有3条路,分别是1-6.1-3.1-2. ...
- C# 迪杰斯特拉算法 Dijkstra
什么也不想说,现在直接上封装的方法: using System; using System.Collections.Concurrent; using System.Collections.Gener ...
- 迪杰斯特拉(dijkstra)算法的简要理解和c语言实现(源码)
迪杰斯特拉(dijkstra)算法:求最短路径的算法,数据结构课程中学习的内容. 1 . 理解 算法思想::设G=(V,E)是一个带权有向图,把图中顶点集合V分成两组,第一组为已求出最短路径的顶点集合 ...
- 图-最短路径-Dijktra(迪杰斯特拉)算法
1. 迪杰斯特拉算法是由荷兰计算机科学家狄克斯特拉算法于1959 年提出的,因此又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题.迪杰斯特拉算法主要特点是以起始 ...
- 迪杰斯特拉算法——PAT 1003
本文主要是将我对于我对于迪杰斯特拉算法的理解写出来,同时通过例题来希望能够加深对于算法的理解,其中有错误的地方希望大家指正. 迪杰斯特拉算法 我将这个算法理解成一个局部到整体的算法,这个方法确实越研究 ...
- 迪杰斯特拉(Java)
public class Dijsktra { public static void main(String[] args) { Dijsktra d=new Dijsktra(); int[][] ...
随机推荐
- 【linux】Linux系统信息查看命令大全
系统 # uname -a # 查看内核/操作系统/CPU信息 # head -n 1 /etc/issue # 查看操作系统版本 # cat /proc/cpuinfo # 查看CPU信息 # ho ...
- win xp 环境变量PATH默认值
%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem
- <meta name="viewport" content="width=device-width, initial-scale=1.0">的说明
今天在做适配手机版时,chrome调到手机版,但是还是显示PC端的样式,无法展现出手机端的样式: 开始的时候还以为是chrome版本的问题,最新版本的chrome62.0是有很多变化的,而之前工作中使 ...
- struts2学习(1)struts2 helloWorld
一.struts2简介: 二.helloWorld: 1)工程结构: HelloWorldAction.java: package com.cy.action; import com.opensymp ...
- selenium 笔记 2018
1.指定浏览器驱动:dr = webdriver.Firefox(executable_path = '/Users/xxx/Documents/selenium_py/geckodriver/gec ...
- HDU 4497 GCD and LCM(数论+容斥原理)
GCD and LCM Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)Total ...
- UI“三重天”之selenium--常用API和问题处理(三)
Selenium常用API: 前面两篇示例代码中用到了一些selenium的API方法,例如定位元素的八种方法.访问url.等待.操作浏览器.获取title.点击.清理等等. 有关于selenium的 ...
- php调用dll经验小结
最近做一个网站,需要频繁使用远程数据,数据接口已经做好.在做转换的时候遇到了性能上的问题:开始打算用php来实现转换,苦苦查了数天,都没有找到直接操作字节的方法.虽然可以使用 pack() 方法将各个 ...
- sqlserver基础操作
启动服务: 1.在系统服务启动 2.在sql配置管理器服务选项中启动 3.在管理员cmd:net start mssqlserver;net stop mssqlserver use master g ...
- js 按字段分组
var data = [{"id":"32b80b76-a81e-4545-8065-1e7c57180801","userId":&quo ...