Dijkstra算法初步 - 迷宫问题
第一行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<algorithm>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<vector>
#include<queue>
using namespace std; #define Int __int64
#define INF 0x3f3f3f3f const int MAXN = 555;
int n, m, s, e; int maze[MAXN][MAXN];
int dis[MAXN];
bool vis[MAXN];
int score[MAXN];
int ans[MAXN]; void init() {
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (i == j) maze[i][j] = 0;
else maze[i][j] = INF;
}
}
memset(dis, 0, sizeof(dis));
memset(vis, false, sizeof(vis));
memset(ans, false, sizeof(ans));
} void Dijkstra() {
for (int i = 0; i < n; i++) {
scanf("%d", &score[i]);
} int u, v, w;
for (int i = 0; i < m; i++) {
scanf("%d %d %d", &u, &v, &w);
if (w < maze[u][v]) {
maze[u][v] = w;
maze[v][u] = w;
}
} for (int i = 0; i < n; i++) {
dis[i] = maze[s][i];
if (i != s) ans[i] = score[s] + score[i];//初始化的时候也要判断等于的情况
else ans[i] = score[i];
} for (int i = 0; i < n; i++) { int pos, Min = INF;
for (int a = 0; a < n; a++) {
if (vis[a]) continue;
if (dis[a] < Min) {
Min = dis[a];
pos = a;
}
}
vis[pos] = true; for (int a = 0; a < n; a++) { if (maze[pos][a] < INF) {
if (dis[a] > dis[pos] + maze[pos][a]) {
dis[a] = dis[pos] + maze[pos][a];
ans[a] = ans[pos] + score[a];
} else if ((dis[a] == dis[pos] + maze[pos][a]) && (ans[a] < ans[pos] + score[a]) && pos != a) {/*就是这里要判断等于的时候是不行的*/
ans[a] = ans[pos] + score[a];
} else {
continue;
}
}
}
}
}
int main()
{
freopen("input.txt", "r", stdin); while (scanf("%d %d %d %d", &n, &m, &s, &e) != EOF) {
init();
Dijkstra();
printf("%d %d\n", dis[e], ans[e]);
}
return 0;
}
Dijkstra算法初步 - 迷宫问题的更多相关文章
- 2019中山纪念中学夏令营-Day14 图论初步【dijkstra算法求最短路】
Dijkstra是我学会的第一个最短路算法,为什么不先去学SPFA呢?因为我在luogu上翻到了一张比较神奇的图: 关于SPFA -它死了 以及网上还有各位大佬的经验告诉我:SPFA这玩意很容易被卡. ...
- 51nod-迷宫问题(Dijkstra算法)
关于Dijkstra算法的博文 http://www.cnblogs.com/skywang12345/p/3711512.html#anchor2 Dijkstra算法是一个经典的算法——他是荷兰计 ...
- Dijkstra算法详细(单源最短路径算法)
介绍 对于dijkstra算法,很多人可能感觉熟悉而又陌生,可能大部分人比较了解bfs和dfs,而对dijkstra和floyd算法可能知道大概是图论中的某个算法,但是可能不清楚其中的作用和原理,又或 ...
- 图论篇3——最短路径 Dijkstra算法、Floyd算法
最短路径 问题背景:地图上有很多个城市,已知各城市之间距离(或者是所需时间,后面都用距离了),一般问题无外乎就是以下几个: 从某城市到其余所有城市的最短距离[单源最短路径] 所有城市之间相互的最短距离 ...
- 求两点之间最短路径-Dijkstra算法
Dijkstra算法 1.定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.D ...
- Dijkstra算法优先队列实现与Bellman_Ford队列实现的理解
/* Dijkstra算法用优先队列来实现,实现了每一条边最多遍历一次. 要知道,我们从队列头部找到的都是到 已经"建好树"的最短距离以及该节点编号, 并由该节点去更新 树根 到其 ...
- 关于dijkstra算法的一点理解
最近在准备ccf,各种补算法,图的算法基本差不多看了一遍.今天看的是Dijkstra算法,这个算法有点难理解,如果不深入想的话想要搞明白还是不容易的.弄了一个晚自习,先看书大致明白了原理,就根据书上的 ...
- 最短路模板(Dijkstra & Dijkstra算法+堆优化 & bellman_ford & 单源最短路SPFA)
关于几个的区别和联系:http://www.cnblogs.com/zswbky/p/5432353.html d.每组的第一行是三个整数T,S和D,表示有T条路,和草儿家相邻的城市的有S个(草儿家到 ...
- Dijkstra算法(二)之 C++详解
本章是迪杰斯特拉算法的C++实现. 目录 1. 迪杰斯特拉算法介绍 2. 迪杰斯特拉算法图解 3. 迪杰斯特拉算法的代码说明 4. 迪杰斯特拉算法的源码 转载请注明出处:http://www.cnbl ...
随机推荐
- 分享一个.NET实现的简单高效WEB压力测试工具
在Linux下对Web进行压力测试的小工具有很多,比较出名的有AB.虽然AB可以运行在windows下,但对于想简单界面操作的朋友有点不太习惯.其实vs.net也提供压力测试功能但显然显得太重了,在测 ...
- Mac OSX定位命令路径的方法
可以使用which命令来定位一个命令. http://www.cyberciti.biz/faq/how-do-i-find-the-path-to-a-command-file/
- codevs2645 Spore
题目描述 Description 某陈和某Y 最近对一个游戏着迷.那是Electronic Arts 今年发布的优秀的模拟经营类游戏,Spore. 在Spore 中,玩家将经历从单细胞生物到星系的统治 ...
- JavaScript - 对象
1.对象(Object)或实例(instance):在JavaScript中,对象则是数据与程序代码的组合,它可以是整个应用程序或整个应用程序的一部分. 2.属性(property)或字段(filed ...
- ReflectionToStringBuilder类
ReflectionToStringBuilder类是用来实现类中的toString()方法的类,它采用Java反射机制(Reflection),通过reflection包中的AccessibleOb ...
- mysql取前取后
SELECT * FROM (SELECT * FROM 表 WHERE id<居中的ID ORDER BY id DESC LIMIT 5) as A UNION all SELECT * F ...
- rcnn学习(六):imdb.py学习
# -------------------------------------------------------- # Fast R-CNN # Copyright (c) 2015 Microso ...
- 2016年11月28日--ADO.Net 查、插、删、改 小练习
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- ecshop常用二次开发修改
修改ecshop支付宝的支付按钮 http://www.68ecshop.com/article-1081.html 去掉ecshop收货人信息页面的电子邮件必填和电话.手机选填一个 http:/ ...
- bootstrap 笔记
导航条: div.navbar.navbar-default > ul.nav.navbar 无非两层: 父div: navbar {相对位置.最低高度50px.下部margin:20px.透明 ...