引言

要解决最短路径问题,先引入加权有向图的数据结构。这和 加权无向图的数据结构很类似。

有关概念可参考博文数据结构之图的概述

加权有向边

package com.algorithms.graph;/*** @author yjw* @date 2019/6/5/005*/
public final class DirectedEdge {/*** 边的起点*/private final int v;/*** 边的终点*/private final int w;/*** 边的权重*/private final double weight;public DirectedEdge(int v, int w, double weight) {this.v = v;this.w = w;this.weight = weight;}public double weight() {return weight;}public int from() {return v;}public int to() {return w;}@Overridepublic String toString() {return String.format("%d -> %d(%.2f)", v, w, weight);}
}

加权有向图

package com.algorithms.graph;import java.util.HashSet;
import java.util.Set;/*** @author yjw* @date 2019/6/5/005*/
@SuppressWarnings("unchecked")
public class EdgeWeightedDigraph {private final int vertexNum;private int edgeNum;private Set<DirectedEdge>[] adj;public EdgeWeightedDigraph(int vertexNum) {this.vertexNum = vertexNum;this.edgeNum = 0;adj = (Set<DirectedEdge>[]) new HashSet[vertexNum];for (int v = 0; v < vertexNum; v++) {adj[v] = new HashSet<>();}}public int vertexNum() {return vertexNum;}public int edgeNum() {return edgeNum;}public void addEdge(DirectedEdge e) {if (adj[e.from()].add(e)) {edgeNum++;}}public void addEdge(int start,int end,double weight) {addEdge(new DirectedEdge(start,end,weight));}//提供增加边的便利方法/*** 以同一起点增加两条边*/public void addEdges(int start,int end1,double weight1,int end2,double weight2) {addEdge(start,end1,weight1);addEdge(start,end2,weight2);}/*** 增加三条边*/public void addEdges(int start,int end1,double weight1,int end2,double weight2,int end3,double weight3) {addEdges(start,end1,weight1,end2,weight2);addEdge(start,end3,weight3);}/*** 增加四条边*/public void addEdges(int start,int end1,double weight1,int end2,double weight2,int end3,double weight3,int end4,double weight4) {addEdges(start,end1,weight1,end2,weight2,end3,weight3);addEdge(start,end4,weight4);}/*** 增加五条边*/public void addEdges(int start,int end1,double weight1,int end2,double weight2,int end3,double weight3,int end4,double weight4,int end5,double weight5) {addEdges(start,end1,weight1,end2,weight2,end3,weight3,end4,weight4);addEdge(start,end5,weight5);}public Iterable<DirectedEdge> adj(int v) {return adj[v];}public Iterable<DirectedEdge> edges() {Set<DirectedEdge> set = new HashSet<>();for (int v = 0; v < vertexNum; v++) {set.addAll(adj[v]);}return set;}@Overridepublic String toString() {StringBuilder s = new StringBuilder("(" + vertexNum + " vertices, " + edgeNum + " edges)\n");for (int v = 0; v < vertexNum; v++) {s.append(v).append(": ");for (DirectedEdge e: this.adj(v)) {s.append(e).append(" ");}s.append("\n");}return s.toString();}
}

我们就来通过这个类构造上面这个图吧,构造代码:

EdgeWeightedDigraph g = new EdgeWeightedDigraph(8);
g.addEdges(0,2,.26,4,.38);
g.addEdge(1,3,.29);
g.addEdge(2,7,.34);
g.addEdge(3,6,.52);
g.addEdges(4,7,.37,5,.35);
g.addEdges(5,1,.32,7,.28,4,.35);
g.addEdges(6,4,.93,0,.58,2,.40);
g.addEdges(7,3,.39,5,.28);System.out.println(g);

输出为:

(8 vertices, 15 edges)
0: 0 -> 2(0.26) 0 -> 4(0.38)
1: 1 -> 3(0.29)
2: 2 -> 7(0.34)
3: 3 -> 6(0.52)
4: 4 -> 5(0.35) 4 -> 7(0.37)
5: 5 -> 4(0.35) 5 -> 1(0.32) 5 -> 7(0.28)
6: 6 -> 4(0.93) 6 -> 0(0.58) 6 -> 2(0.40)
7: 7 -> 5(0.28) 7 -> 3(0.39)

图论算法——加权有向图的数据结构相关推荐

  1. 数据结构之图:加权有向图与dijkstra算法找到最短路径,Python——28

    加权有向图与dijkstra算法找到最短路径 加权有向图的构造 最短路径问题与最短路径树 最短路径问题(The shortest path problem)定义 最短路径可以是时间花费最短,也可以是距 ...

  2. 算法导论 pdf_学习数据结构和算法最好的书是什么?

    ----------- 通知:如果本站对你学习算法有帮助,请收藏网址,并推荐给你的朋友.由于 labuladong 的算法套路太火,很多人直接拿我的 GitHub 文章去开付费专栏,价格还不便宜.我这 ...

  3. warshall算法求传递闭包c++_【建模小课堂】图论算法

    图论算法 图论算法在计算机科学中扮演着很重要的角色,它提供了对很多问题都有效的一种简单而系统的建模方式.很多问题都可以转化为图论问题,然后用图论的基本算法加以解决.这类问题算法主要包括Dijkstra ...

  4. 图论算法—图的拓扑排序介绍和Kahn算法原理解析以及Java代码的实现

    详细介绍了图的拓扑排序的概念,然后介绍了求拓扑序列的算法:Kahn算法的原理,最后提供了基于邻接矩阵和邻接表的图对该算法的Java实现. 阅读本文需要一定的图的基础,如果对于图不是太明白的可以看看这篇 ...

  5. 【力扣】787. K 站中转内最便宜的航班加权——有向图最短路径

    前言 我感觉这题比较有代表性,所以记录一下,这题是加权有向图中求最短路径的问题. 题目 787. K 站中转内最便宜的航班 动态规划 假设有一条路径是[src, i, ..., j, dst],解法一 ...

  6. 图论算法之最短路径(Dijkstra、Floyd、Bellman-ford和SPFA)

    图论算法之最短路径(Dijkstra.Floyd.Bellman-ford和SPFA) 1.图论最短路径概述 图论算法为了求解一个顶点到另一个顶点的最短路径,即如果从图中某一顶点(称为源点)到达另一顶 ...

  7. Algorithm:C++语言实现之图论算法相关(图搜索广度优先BFS、深度优先DFS,最短路径SPF、带负权的最短路径Bellman-ford、拓扑排序)

    Algorithm:C++语言实现之图论算法相关(图搜索广度优先BFS.深度优先DFS,最短路径SPF.带负权的最短路径Bellman-ford.拓扑排序) 目录 一.图的搜索 1.BFS (Brea ...

  8. 算法竞赛入门经典 写题笔记(第五章 图论算法与模型2)

    本节内容-- 2-SAT dijstra算法的一些应用 SPFA算法的一些应用 例题9 飞机调度 有n架飞机需要着陆.每架飞机都可以选择"早着陆"和"晚着陆"两 ...

  9. 最短路径(加权有向图)

    最短路径 1. 最短路径定义以及性质 定义: 在一副加权有向图中,从顶点s到顶点t的最短路径是所有从顶点s到顶点t的路径中总权重最小的那条路径. 性质: 路径具有方向性. 权重不一定等于距离.权重可以 ...

  10. 【liuyubobobo-玩转图论算法】第一章 课程概述

    持续学习&持续更新中- 守破离 [liuyubobobo-玩转图论算法]第一章 课程概述 图论概述 课程特色 课程大纲 图论的应用 参考 <玩转数据结构>是<图论课程> ...

最新文章

  1. 《人工智能转型手册》,吴恩达 著
  2. msc货物跟踪查询_图川铅循货物运输安全管理系统
  3. 磁盘管理第一章(分区与格式化)
  4. 50本.NTE、C#相关技术书籍免费下载
  5. Run tomcat 5.5 in windows server 2003 x64
  6. 微软修复工具_微软正在推出更新以修复此前被发现的Windows 10 SFC问题
  7. 使用Azure云原生构建博客是怎样一种体验?(上篇)
  8. 苹果台式机_苹果史上最强台式机来了:顶配售价45万
  9. 网站访客系统php,PHP实现网站访客来访显示访客IP浏览器操作系统
  10. UML-基于GRASP对象设计步骤
  11. 【Kafka】A broker is already registered on the path /brokers/ids/0. This probably indicates that you
  12. 大数据技术Hadoop介绍
  13. webpack打包报错 [webpack-cli] TypeError: merge is not a function
  14. php判断360浏览器是否是兼容模式,JS判断是否360安全浏览器极速内核的方法
  15. 新站如何解决收录问题
  16. Element 入门教程
  17. 2.3 VLAN间路由
  18. mysql 8.0.28安装教程(超简单)
  19. Java 蓝桥杯 我们的征途是星辰大海
  20. 吴思里:字节前端面试经历

热门文章

  1. c#语法复习总结(1)-浅谈c#.net
  2. 13.3.5 【接口和委托的泛型可变性】限制和说明
  3. [洛谷P1082]同余方程
  4. o'Reill的SVG精髓(第二版)学习笔记——第四章
  5. 内存记号(Memory Trail)[自定义的名字] --调试方法
  6. 【C#】开发可以可视化操作的windows服务
  7. 中国分省市地图导航-SVG格式(基于Raphaël)
  8. Android:Toolbar的图标尺寸问题
  9. Spring DelegatingFilterProxy 过滤器 的原理及运用
  10. Goland的常用快捷键