最短路径

dijkstra算法,单源最短路径

隐身守侯 提交于 2019-12-11 12:18:19
单源最短路径算法C++简单实现 参考文章: https://www.jianshu.com/p/ff6db00ad866 #include<iostream> using namespace std; #define MAX 10000 int map[5][5]={ {0,4,MAX,2,MAX}, {4,0,4,1,MAX}, {MAX,4,0,1,3}, {2,1,1,0,7}, {MAX,MAX,3,7,0} }; int main() { char start; int S[5]={0},U[5]; cout<<"enter start node :"<<endl; cin>>start; for(int i=0;i<5;i++) { U[i]=map[start-'A'][i]; } for(int i=0;i<5;i++) { int dim=MAX,k; for(int j=0;j<5;j++) { if((S[j]==0)&&((U[j])<dim)) { dim=U[j]; k=j; } } S[k]=1; for(int j=0;j<5;j++) { if(map[k][j]+dim<U[j]) U[j]=map[k][j]+dim; } } for(int i=0;i<5;i++) cout<<start<<"到"<<(char)('A'+i)<<"距离"<

学号 2019-2020-2314《数据结构与面向对象程序设计》实验九实验报告

自作多情 提交于 2019-12-08 20:55:37
学号 2019-2020-2314《数据结构与面向对象程序设计》实验九实验报告 课程:《程序设计与数据结构》 班级: 1823 姓名: 鞠明翰 学号:20182314 实验教师:王志强 实验日期:2019年12月2日 必修/选修: 必修 1.实验内容 完成图的综合实践 (1)初始化:根据屏幕提示(例如:输入1为无向图,输入2为有向图)初始化无向图和有向图(可用邻接矩阵,也可用邻接表),图需要自己定义(顶点个数、边个数,建议先在草稿纸上画出图,然后再输入顶点和边数) (2)图的遍历:完成有向图和无向图的遍历(深度和广度优先遍历) (3)完成有向图的拓扑排序,并输出拓扑排序序列或者输出该图存在环 (4)完成无向图的最小生成树(Prim算法或Kruscal算法均可),并输出 (5)完成有向图的单源最短路径求解(迪杰斯特拉算法) 2. 实验过程 生成图: import java.io.*; public class ToPoTest { public static void main(String[] args) throws IOException { ToPo directedGraph = new ToPo(); try{ directedGraph.topoSort(); }catch(Exception e){ System.out.println("graph has

贪心算法初探3——最短路径(Dijkstra算法)

筅森魡賤 提交于 2019-12-07 15:44:26
  问题描述:给定有向带权图G=(V,E),其中每条边的权是非负实数。此外,给定V中的一个顶点,称为源点。现在要计算从源点到所有其他各顶点的最短路径长度,这里路径长度指路上各边的权之和。   算法设计:这个问题一般采用迪杰斯特拉算法(Dijkstra)算法思想是先求出长度最短的一条路径,再参照该最短路径求出长度次短的一条路径,直到求出从源点到其他各个顶点的最短路径。   算法基本思想:先假定源点为u,顶点集合V被划分为两部分:集合V以及集合V-S。初始时S中仅含有u,其中S的顶点到源点的最短路径已经确定。集合V-S中华包含的顶点到源点的最短路径长度待定,称从源点出发只经过S中的点到V-S中点的路径为特殊路径,并用数组dict[]记录当前每个顶点所对应的最短特殊路径长度。   贪心策略选择:选择特殊路径长度最短的路径,将其连接的V-S顶点加入到集合S中,同时更新数组dict[].一旦S包含了所有的顶点,dict[]就储存了从源到所有其他顶点之间的最短路径长度。   算法详情:   1:设置地图带权邻接矩阵为map[][],如果从源点u到顶点i有边,就map[u][i]等于<u,i>的权值,否则map[u][i]=∞;使用一维数组dict[i]记录从源点到i顶点的最短路径长度;使用一维数组p[i]记录最短路径上i顶点的前驱。   2:设置一个集合S={u},对于集合V-S中所有顶点x

20182301 2019-2020-1 《数据结构与面向对象程序设计》实验9报告

混江龙づ霸主 提交于 2019-12-07 09:13:34
20182301 2019-2020-1 《数据结构与面向对象程序设计》实验9报告 课程:《程序设计与数据结构》 班级: 1823 姓名: 赵沛凝 学号:20182301 实验教师:王志强 实验日期:2019年12月2日 必修/选修: 必修 1.实验内容 初始化:根据屏幕提示(例如:输入1为无向图,输入2为有向图)初始化无向图和有向图(可用邻接矩阵,也可用邻接表),图需要自己定义(顶点个数、边个数,建议先在草稿纸上画出图,然后再输入顶点和边数)(2分) 图的遍历:完成有向图和无向图的遍历(深度和广度优先遍历)(4分) 完成有向图的拓扑排序,并输出拓扑排序序列或者输出该图存在环(3分) 完成无向图的最小生成树(Prim算法或Kruscal算法均可),并输出(3分) 完成有向图的单源最短路径求解(迪杰斯特拉算法)(3分) 2. 实验过程及结果 初始化无向图和有向图: 有向图的建立算法 System.out.println("请按‘头节点 尾节点 回车’的形式依次输入边的信息"); for (int i=0;i<edgeNum;i++){ String preName = scan.next(); String folName = scan.next(); Vertex preV = getVertex(preName); Vertex folV = getVertex(folName)

最短路--Floyd

时光毁灭记忆、已成空白 提交于 2019-12-06 08:32:48
Floyd--多源最短路 算法思想 i到j的最短路径,我们可以找一个中间点k,然后变成子问题,i到k的最短路径和k到j的最短路径. d[i][j]=min(d[i][j],d[i][k]+d[k][j]) 模板 for(int i = 1; i <= n; i++) { for(int j = 1; j <= n; j++) { for(int k = 1; k <= n; k++) { if(a[i][j] > a[i][k]+a[k][j]) a[i][j] = a[i][k]+a[k][j]; } } } 例题 参考博客 https://blog.csdn.net/xianpingping/article/details/79947091 来源: https://www.cnblogs.com/hezongdnf/p/11972660.html

最短路径算法:弗洛伊德(Floyd-Warshall)算法

余生颓废 提交于 2019-12-05 20:13:18
一、算法介绍   Floyd-Warshall算法 (英语: Floyd-Warshall algorithm),中文亦称 弗洛伊德算法 ,是解决任意两点间的 最短路径 的一种算法,可以正确处理 有向图 或负权(但不可存在负权回路)的最短路径问题,同时也被用于计算有向图的传递闭包。 Floyd-Warshall算法的 时间复杂度 为 O(N 3 ), 空间复杂度 为 O(N 2 )。 二、算法原理 Floyd-Warshall算法的原理是 动态规划 。 设 D i,j,k 为从 i 到 j 的只以 (1..k) 集合中的节点为中间节点的最短路径的长度。 若最短路径经过点 k,则 D i,j,k = D i,k,k-1 + D k,j,k-1 ; 若最短路径不经过点 k,则 D i,j,k =D i,j,k-1 。 因此, D i,j,k = min (D i,j,k-1 , D i,k,k-1 + D k,j,k-1 )。 1 for (k = 0; k < V; k++) { 2 for (i = 0; i < V; i++) { 3 for (j = 0; j < V; j++) { 4 if (dist[i][j] > dist[i][k] + dist[k][j]) { 5 dist[i][j] = dist[i][k] + dist[k][j]; 6 } 7 } 8 }

(模板)最短路径

青春壹個敷衍的年華 提交于 2019-12-05 17:48:27
—————————————————————————————————————————————————— —————————————————————前排护眼——————————————————————— —————————————————————————————————————————————————— 1.Floyd O(n^3) //暴力松弛,优化后,Map[i][j]表示结点i到结点j的最短距离 int n,Map[1005][1005]; int main(){ cin>>n; for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ scanf("%d",&Map[i][j]); } } for(int k=1;k<=n;k++){ for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ if(Map[i][j]>Map[i][k]+Map[k][j]){ Map[i][j]=Map[i][k]+Map[k][j]; } } } } } 来源: https://www.cnblogs.com/xiaozezz/p/11938275.html

单源最短路径算法:迪杰斯特拉 (Dijkstra) 算法

醉酒当歌 提交于 2019-12-05 12:10:30
一、算法介绍   迪杰斯特拉算法 (英语: Dijkstra's algorithm)由荷兰计算机科学家艾兹赫尔·迪杰斯特拉在1956年提出。迪杰斯特拉算法使用了广度优先搜索解决赋权有向图的单源最短路径问题。这个算法是通过为每个顶点 v 保留当前为止所找到的从s到v的最短路径来工作的。   初始时,原点 src 的路径权重被赋为 0 ( dist[src] = 0)。若对于顶点 m 存在能直接到达的边(src, m),则把d[m]设为w(src, m),同时把所有其他(src不能直接到达的)顶点的路径长度设为无穷大,即表示我们不知道任何通向这些顶点的路径(对于所有顶点的集合 V 中的任意顶点 v , 若 v 不为 src 和上述 m 之一, dist[v] = ∞)。当算法结束时, dist[v] 中存储的便是从 src 到 v 的最短路径,或者如果路径不存在的话是无穷大。   边的拓展是 Dijkstra 算法的基础操作:如果存在一条从 u 到 v 的边,那么从 src 到 v 的最短路径可以通过将边( u , v )添加到从 src 到 u 的路径尾部来拓展一条从 src 到 v 的路径。这条路径的长度是 dist[u] + w(u, v)。如果这个值比当前已知的 dist[v] 的值要小,我们可以用新的最小值来替代当前 dist[v] 中的值。拓展边的操作一直运行到所有的

bfs(同一最短路径)

自作多情 提交于 2019-12-05 11:45:10
http://oj.jxust.edu.cn/contest/Problem?id=1702&pid=7 题意:现在有两个相同大小的地图,左上角为起点,右下角问终点。问是否存在同一条最短路径。最短距离一样,他们走的路径也一样。 n 行 m 列(1 <= n , m <= 500) 存在就输出YES , 否则NO; 解法:三个bfs (其中一个是合并的图),判断三个最短路径是否相等且不为-1(不存在)。 //#include <bits/stdc++.h> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <iostream> #include <string> #include <stdio.h> #include <queue> #include <stack> #include <map> #include <set> #include <string.h> #include <vector> #define ME(x , y) memset(x , y , sizeof(x)) #define SF(n) scanf("%d" , &n) #define rep(i , n) for(int i = 0 ; i < n ; i ++) #define INF

【algo&ds】7.最短路径问题

此生再无相见时 提交于 2019-12-05 11:12:18
单源最短路径问题:从某固定源点出发,求其到所有其他顶点的最短路径 (有向)无权图:BFS (有向)有权图:Dijkstra算法 多源最短路径问题:求任意两顶点间的最短路径 直接将单源最短路算法调用|V|遍 Floyd算法 1.BFS算法求解单源无权图最短路径 1.1算法描述 广度优先搜索,开一个 额外的数组存储每一个结点的访问状态 ,一层一层(取出队首元素,遍历所有相邻且未被访问的结点)的 入队列 ,然后层数++ 这里的额外数组就是dist[w],指的是从源点到顶点w的最短路径长度,初始化为-1,判断未访问即==-1,如果未访问且存在边 G[v][w] 则dist[w] = dist[v] +1 ; path数组用于保存每一个顶点w的前驱顶点v,也即这条最短路径(s->w)必定是从(s->....->v->w),通过栈来逆序输出path[w] 、path[path[w]].... 更加详细的算法示例可以 参考视频 1.2代码实现 #include<iostream> #include<stdlib.h> #include<cstdlib> #include<queue> #include<stack> #define Init -1 #define MaxVertex 100 int path[MaxVertex]; // 存储路径,如果当前顶点v出队列,且存在顶点v->w的路径