Dijkstra算法:任意两点间的最短路问题 路径还原
#define _CRT_SECURE_NO_WARNINGS
/*
7 10
0 1 5
0 2 2
1 2 4
1 3 2
2 3 6
2 4 10
3 5 1
4 5 3
4 6 5
5 6 9
0 6
*/
#include <iostream>
#include <vector>
#include <utility>
#include <queue>
#include <functional>
#include <algorithm>
#include <cstdio>
using namespace std; const int maxn = + ;
const int INF = ;
int V, E;
int Prev[maxn]; //最短路上的前驱顶点
int d[maxn];
int cost[maxn][maxn]; //i->j 上的权值
int used[maxn]; void input();
void init();
//求从起点s出发到各个顶点的最短距离
void dijkstra(int s); void init() {
for (int i = ; i < V; i++) {
for (int j = ; j < V; j++) {
if (i == j) {
cost[i][j] = ;
}
else {
cost[i][j] = INF;
}
}
}
} void input()
{
int s, t, ct;
for (int i = ; i < E; i++) {
cin >> s >> t >> ct;
cost[s][t] = cost[t][s] = ct;
}
} //从s点出发到各个顶点的最短距离
void dijkstra(int s)
{
fill(d, d + V, INF);
fill(used, used + V, false);
fill(Prev, Prev + V, -);
d[s] = ; while (true) {
int v = -;
for (int u = ; u < V; u++) {
if (!used[u] && (v == - || d[u] < d[v]))
v = u; //找出到下一条尝试的顶点中距离最短的点
} if (v == -) break;
used[v] = true; for (int u = ; u < V; u++) {
if (d[u] > d[v] + cost[v][u]) {
d[u] = d[v] + cost[v][u]; //从v到各个临边u中最短的路-->存放到d[u],用于下一次计算
Prev[u] = v; //u的前驱是v
}
}
}
} //到顶点t的最短路
vector<int> get_path(int t) {
vector<int> path;
for (; t != -; t = Prev[t]) path.push_back(t); //不断沿着Prev[t]走直到 t = s
//这样得到的是按照t到s的顺序,所以翻转之
reverse(path.begin(), path.end());
return path;
} int main()
{
cin >> V >> E;
init();
input();
int st, ov;
cin >> st >> ov;
dijkstra(st);
cout << d[ov] << endl;
cout << "Debug..........\n";
vector<int> path = get_path(ov);
for (int i = ; i < path.size(); i++) {
cout << path[i] << " ";
} cout << endl;
return ;
}
Dijkstra算法:任意两点间的最短路问题 路径还原的更多相关文章
- 【算法】Floyd-Warshall算法(任意两点间的最短路问题)(判断负圈)
求解所有两点间的最短路问题叫做任意两点间的最短路问题. 可以用动态规划来解决, d[k][i][j] 表示只用前k个顶点和顶点i到顶点j的最短路径长度. 分两种情况讨论: 1.经过顶点k, d[k] ...
- 任意两点间的最短路问题(Floyd-Warshall算法)
/* 任意两点间的最短路问题(Floyd-Warshall算法) */ import java.util.Scanner; public class Main { //图的顶点数,总边数 static ...
- 图算法之Floyd-Warshall 算法-- 任意两点间最小距离
1.Floyd-Warshall 算法 给定一张图,在o(n3)时间内求出任意两点间的最小距离,并可以在求解过程中保存路径 2.Floyd-Warshall 算法概念 这是一个动态规划的算法. 将顶点 ...
- 任意两点间的最短路问题(Floyd-Warshall算法)
#define _CRT_SECURE_NO_WARNINGS /* 7 10 0 1 5 0 2 2 1 2 4 1 3 2 2 3 6 2 4 10 3 5 1 4 5 3 4 6 5 5 6 9 ...
- C++求图任意两点间的所有路径
基于连通图,邻接矩阵实现的图,非递归实现. 算法思想: 设置两个标志位,①该顶点是否入栈,②与该顶点相邻的顶点是否已经访问. A 将始点标志位①置1,将其入栈 B 查看栈顶节点V在图中,有没有可以到达 ...
- AOJ GRL_1_C: All Pairs Shortest Path (Floyd-Warshall算法求任意两点间的最短路径)(Bellman-Ford算法判断负圈)
题目链接:http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=GRL_1_C All Pairs Shortest Path Input ...
- LCA - 求任意两点间的距离
There are n houses in the village and some bidirectional roads connecting them. Every day peole alwa ...
- HDU 1874 畅通工程续-- Dijkstra算法详解 单源点最短路问题
参考 此题Dijkstra算法,一次AC.这个算法时间复杂度O(n2)附上该算法的演示图(来自维基百科): 附上: 迪科斯彻算法分解(优酷) problem link -> HDU 1874 ...
- 任意两点间最短距离floyd-warshall ---- POJ 2139 Six Degrees of Cowvin Bacon
floyd-warshall算法 通过dp思想 求任意两点之间最短距离 重复利用数组实现方式dist[i][j] i - j的最短距离 for(int k = 1; k <= N; k++) f ...
随机推荐
- multer处理post请求的代码演示
let express = require('express'); let multer = require('multer'); let mObj = multer({dest:__dirname+ ...
- GS环境里面 9999 常用密码的加密后的值
1. Test6530 APTZ5s6vrw1dglqO/63osA== 2. aaaaaa zgnewZXGGoqcPGtNpXTSXQ== 3. cwpass 3Me34S0+zY4xEGUFtz ...
- ELK日志框架(1):安装Elasticsearch组建单服务器多节点集群
ELK简介 最近有个需求搭建一套日志系统用于集成几个业务系统的日志提供快速的检索功能,目前是用Log4net存数据库+Error级别发邮件方式,也算简单暴力好用,但历史日志的模糊查询确实很慢,所以使用 ...
- git worktree 是什么及其使用场景
先上总结: 在git worktree出现之前, git切换分支前后的文件都只存在在当前文件夹下, git worktree出现之后, 我们可以将分支切换到其他文件夹下 比如如果你的项目有很多个版本分 ...
- windows上搭建nginx
命令 相关命令(需定位到所在目录):安装:start nginx.exe 停止运行:nginx.exe -s stop 或在进程找到nginx.exe结束重启:nginx.exe -s reload ...
- Leetcode 1.两数之和 By Python
思路 很容易想到的方法是二重循环遍历一遍,但是会很慢 把加法变减法可以大大加速 代码 class Solution: def twoSum(self, nums, target): "&qu ...
- 学习Spring Boot:(二十)使用 MongoDB
前言 MongoDB 1 是可以应用于各种规模的企业.各个行业以及各类应用程序的开源数据库.基于分布式文件存储的数据库.由C++语言编写.旨在为WEB应用提供可扩展的高性能数据存储解决方案.Mongo ...
- 打开SharePoint 2013 web application显示iis 欢迎页面
当我打开SP web application时,页面显示如下: 查看event log,发现有一些8315-8317之类的error,发现把request management service停掉后, ...
- HASH 字符串哈希 映射转化
哈希HASH的本质思想类似于映射.离散化. 哈希,通过给不同字符赋不同的值.并且钦定一个进制K和模数,从而实现一个字符串到一个模意义下的K进制数上. 它的主要目的是判重,用于$DFS$.$BFS$判重 ...
- A1102. Invert a Binary Tree
The following is from Max Howell @twitter: Google: 90% of our engineers use the software you wrote ( ...