java数据结构和算法------图(最短路径Dijkstra)

  1 package iYou.neugle.graph;
  2
  3 import java.util.ArrayList;
  4 import java.util.List;
  5
  6 //创建图过程的代码在图的那篇博文中,此处直接使用
  7 public class Dijkstra {
  8     private MyGraph1 graph;
  9     private int start;
 10     private int maxNum;
 11     private int[] distance;// 起始点到终点距离
 12     private int[] point;// 除起始点的其他点的集合
 13     private String[] path;// 起始点到终点的路径
 14     private List<Integer> s = new ArrayList<Integer>();// 点的集合
 15
 16     public Dijkstra(MyGraph1 graph, int start) {
 17         this.graph = graph;
 18         this.start = start - 1;
 19         this.maxNum = this.graph.getGraph().maxNum;
 20         distance = new int[this.maxNum - 1];
 21         point = new int[this.maxNum - 1];
 22         path = new String[this.maxNum - 1];
 23     }
 24
 25     // 初始化最小距离数组
 26     private void Init() {
 27         for (int i = 0; i < this.maxNum - 1; i++) {
 28             this.distance[i] = Integer.MAX_VALUE;
 29             if (i >= this.start) {
 30                 this.point[i] = i + 1;
 31             } else {
 32                 this.point[i] = i;
 33             }
 34         }
 35     }
 36
 37     public void DijkstraCore() {
 38         this.Init();
 39         // 首先将起始节点加入到集合s中
 40         this.s.add(this.start);
 41         // 初始化中间节点u
 42         int u = this.start;
 43         // 若果s集合达到maxNum则终止
 44         while (s.size() < this.maxNum) {
 45             int[][] edges = this.graph.getGraph().edge;
 46             boolean b = false;
 47             for (int i = 0; i < edges[u].length; i++) {
 48                 // 如果开始节点和中间节点不连通则不进行任何操作(排除开始节点)
 49                 if (edges[this.start][u] == 0 && u != this.start) {
 50                     break;
 51                 }
 52                 // 节点到起始点的距离是不用求的
 53                 if (i == this.start) {
 54                     b = true;
 55                     continue;
 56                 }
 57                 int x;
 58                 // 如果在起始节点之后的节点需要i--
 59                 if (b == false) {
 60                     x = i;
 61                 } else {
 62                     x = i - 1;
 63                 }
 64                 // 如果有路径则计算
 65                 if (edges[u][i] != 0) {
 66                     int temp = edges[this.start][u] + edges[u][i];
 67                     if (temp < this.distance[x]) {
 68                         this.distance[x] = temp;
 69                         if (this.start == u) {
 70                             this.path[x] = (this.start + 1) + "->" + (i + 1);
 71                         } else {
 72                             this.path[x] = (this.start + 1) + "->" + (u + 1)
 73                                     + "->" + (i + 1);
 74                         }
 75                     }
 76                 }
 77             }
 78             // 找到下一次的中间节点
 79             u = this.Function();
 80             // 将中间点加入到集合s中
 81             this.s.add(u);
 82         }
 83         this.Print();
 84     }
 85
 86     // 功能函数:找到此时distance数组中的最小值(最小值的条件是不在s中的最小值)
 87     private int Function() {
 88         int u = Integer.MAX_VALUE;
 89         int k = -1;
 90         for (int i = 0; i < this.distance.length; i++) {
 91             // 如果在s中存在该节点则继续找其他次小的节点
 92             if (this.s.contains(this.point[i])) {
 93                 continue;
 94             } else {
 95                 if (this.distance[i] < u) {
 96                     u = this.distance[i];
 97                     k = this.point[i];
 98                 }
 99             }
100         }
101         return k;
102     }
103
104     // 打印结果
105     private void Print() {
106         for (int i = 0; i < this.distance.length; i++) {
107             System.out.println(this.path[i] + ":" + this.distance[i]);
108         }
109     }
110
111     public static void main(String[] args) {
112         MyGraph1 graph = new MyGraph1(5, 0);
113         graph.CreateMaxtrixGraph(1, 2, 2);
114         graph.CreateMaxtrixGraph(1, 3, 5);
115         graph.CreateMaxtrixGraph(1, 5, 3);
116         graph.CreateMaxtrixGraph(2, 4, 4);
117         graph.CreateMaxtrixGraph(3, 5, 5);
118         graph.CreateMaxtrixGraph(4, 5, 2);
119         graph.OutPutMaxtrixGraph();
120         Dijkstra dijkstra = new Dijkstra(graph, 2);
121         dijkstra.DijkstraCore();
122     }
123 }
  1 2 3 4 5
1 0 2 5 0 3
2 2 0 0 4 0
3 5 0 0 0 5
4 0 4 0 0 2
5 3 0 5 2 0
2->1:2
2->1->3:7
2->4:4
2->1->5:5
时间: 2024-10-07 05:56:28

java数据结构和算法------图(最短路径Dijkstra)的相关文章

java数据结构和算法------图(最小生成树Kruskal)

1 package iYou.neugle.graph; 2 3 import java.util.Set; 4 import java.util.TreeSet; 5 6 //创建图过程的代码在图的那篇博文中,此处直接使用 7 public class Kruskal { 8 private MyGraph1 graph; 9 private int[] a;// 并查集使用数组(存储前置节点) 10 private Set<Edge> edgeSet = new TreeSet<&g

数据结构:单源最短路径--Dijkstra算法

Dijkstra算法 单源最短路径 给定一带权图,图中每条边的权值是非负的,代表着两顶点之间的距离.指定图中的一顶点为源点,找出源点到其它顶点的最短路径和其长度的问题,即是单源最短路径问题. Dijkstra算法 求解单源最短路径问题的常用方法是Dijkstra(迪杰斯特拉)算法.该算法使用的是贪心策略:每次都找出剩余顶点中与源点距离最近的一个顶点. 算法思想 带权图G=<V,E>,令S为已确定了最短路径顶点的集合,则可用V-S表示剩余未确定最短路径顶点的集合.假设V0是源点,则初始 S={V

Java数据结构和算法之栈与队列

二.栈与队列 1.栈的定义 栈(Stack)是限制仅在表的一端进行插入和删除运算的线性表. (1)通常称插入.删除的这一端为栈顶(Top),另一端称为栈底(Bottom). (2)当表中没有元素时称为空栈. (3)栈为后进先出(Last In First Out)的线性表,简称为LIFO表. 栈的修改是按后进先出的原则进行. 每次删除(退栈)的总是当前栈中"最新"的元素,即最后插入(进栈)的元素,而最先插入的是被放在栈的底部,要到最后才能删除. 图1 [示例]元素是以a1,a2,-,a

java数据结构与算法之顺序表与链表深入分析

转载请注明出处(万分感谢!): http://blog.csdn.net/javazejian/article/details/52953190 出自[zejian的博客] 关联文章: java数据结构与算法之顺序表与链表设计与实现分析 java数据结构与算法之双链表设计与实现 ??数据结构与算法这门学科虽然在大学期间就已学习过了,但是到现在确实也忘了不少,因此最近又重新看了本书-<数据结构与算法分析>加上之前看的<java数据结构>也算是对数据结构的进一步深入学习了,于是也就打算

Java数据结构和算法(一)——开篇

这篇文章里面不讲技术,抽空讲讲技术和通俗之间有一种奇特的关系,还有驱动力学习的东西. 1)技术与通俗 大学里面那本严蔚敏的数据结构不厚,内容丰富,但是复杂问题的讲解方面篇幅这样就少了,比较难理解,c也不是很擅长,但是基本的思路还是有的. 简单的链表,数组,堆栈,队列,图,几个排序算法. 后面看到知乎涛吴的回答,当时很震撼,这里引用一下他的回答: 如果说 Java 是自动档轿车,C 就是手动档吉普.数据结构呢?是变速箱的工作原理.你完全可以不知道变速箱怎样工作,就把自动档的车子从 A 开到 B,而

java数据结构与算法之平衡二叉树(AVL树)的设计与实现

[版权申明]未经博主同意,不允许转载!(请尊重原创,博主保留追究权) http://blog.csdn.net/javazejian/article/details/53892797 出自[zejian的博客] 关联文章: java数据结构与算法之顺序表与链表设计与实现分析 java数据结构与算法之双链表设计与实现 java数据结构与算法之改良顺序表与双链表类似ArrayList和LinkedList(带Iterator迭代器与fast-fail机制) java数据结构与算法之栈(Stack)设

java数据结构与算法之双链表设计与实现

转载请注明出处(万分感谢!): http://blog.csdn.net/javazejian/article/details/53047590 出自[zejian的博客] 关联文章: 关联文章: java数据结构与算法之顺序表与链表设计与实现分析 java数据结构与算法之双链表设计与实现 java数据结构与算法之改良顺序表与双链表类似ArrayList和LinkedList(带Iterator迭代器与fast-fail机制) ??上一篇文章分析顺序表和单链表,本篇就接着上篇继续聊链表,在单链表

hdu1818 It&#39;s not a Bug, It&#39;s a Feature!(隐式图最短路径Dijkstra)

题目链接:点击打开链接 题目描述:补丁在修bug时,有时也会引入新的bug,假设有n(n<=20)个潜在的bug和m(m<=100)个补丁,每个补丁用两个长度为n的字符串表示,其中字符串的每个位置表示一个bug.第一个串表示打补丁之前的状态('-'表示在该位置不存在bug,'+'表示该位置必须存在bug,0表示无所谓),第二个串表示打补丁之后的状态('-'表示不存在,'+'表示存在,0表示不变).每个补丁都有一个执行时间,你的任务是用最少的时间把一个所有bug都存在的软件通过打补丁的方式变得没

java数据结构与算法之树基本概念及二叉树(BinaryTree)的设计与实现

[版权申明]未经博主同意,不允许转载!(请尊重原创,博主保留追究权) http://blog.csdn.net/javazejian/article/details/53727333 出自[zejian的博客] 关联文章: java数据结构与算法之顺序表与链表设计与实现分析 java数据结构与算法之双链表设计与实现 java数据结构与算法之改良顺序表与双链表类似ArrayList和LinkedList(带Iterator迭代器与fast-fail机制) java数据结构与算法之栈(Stack)设