算法思想:

设G=(V,E)是一个带权有向图,把图中顶点集合V分成两组,第一组为已求出最短路径的顶点集合(用S表示,初始时S中只有一个源点,以后每求得一条最短路径 , 就将加入到集合S中,直到全部顶点都加入到S中,算法就结束了),第二组为其余未确定最短路径的顶点集合(用U表示),按最短路径长度的递增次序依次把第二组的顶点加入S中。在加入的过程中,总保持从源点v到S中各顶点的最短路径长度不大于从源点v到U中任何顶点的最短路径长度。此外,每个顶点对应一个距离,S中的顶点的距离就是从v到此顶点的最短路径长度,U中的顶点的距离,是从v到此顶点只包括S中的顶点为中间顶点的当前最短路径长度。

using System.Collections;
using System.Collections.Generic;
using System.Text;
using UnityEngine;
namespace Dijkstra
{public class Vertex{public object Data;public Vertex(object data){this.Data = data;}}public class Edge{public int Start;public int End;public int Weight;public Edge(int start,int end,int weight){this.Start = start;this.End = end;this.Weight = weight;}}public class Graph{//INFINITY=无穷大的数字 = 无穷远的点public const int INFINITY = 65535;public Vertex[] Vertexs;public int VertexCount;public Edge[] Edges;public int[,] Matrix;public Graph(Vertex[] vertexs,Edge[] edges){this.Vertexs = vertexs;this.Edges = edges;VertexCount = Vertexs.Length;this.Matrix = new int[VertexCount, VertexCount];//初始化领接矩阵for (int i = 0; i < VertexCount; i++){for (int j = 0; j < VertexCount; j++){if (i != j){Matrix[i, j] = INFINITY;}}}//初始化边真正存在的权值for (int i = 0; i < Edges.Length; i++){int start = Edges[i].Start;int end = Edges[i].End;Matrix[start, end] = Edges[i].Weight;Matrix[end, start] = Edges[i].Weight;}}/// <summary>/// /// </summary>/// <param name="graph">图</param>/// <param name="start">源点</param>public static void Dijkstra(Graph graph,int original){int[] S = new int[graph.VertexCount];int[] distance = new int[graph.VertexCount];int[] path = new int[graph.VertexCount];S[original] = 1;for (int i = 0; i < graph.VertexCount; i++){distance[i] = graph.Matrix[original, i];path[i] = distance[i] == INFINITY ? -1 : original;}for (int i = 1; i < graph.VertexCount; i++){//找到Distance中最短路径权值int min = INFINITY;int k = original;for (int j = 0; j < distance.Length; j++){if (S[j] != 1 && distance[j] < min){min = distance[j];k = j;}}S[k] = 1;//更新distacne数组for (int j = 0; j < graph.VertexCount; j++){if (S[j] != 1 && distance[j] > distance[k] + graph.Matrix[k, j]){distance[j] = distance[k] + graph.Matrix[k, j];//更新Path数组path[j] = k;}}}//打印for (int i = 0; i < distance.Length; i++){Debug.Log($"顶点{original}到顶点{i}的最短距离为{distance[i]}");}for (int i = 0; i < path.Length; i++){string s = DisPlayPath(FindPath(original, i, path));Debug.Log($"顶点{original}到顶点{i}的路径为为{s}");}}private static List<int> FindPath(int original,int end,int[] path){List<int> Path = new List<int>();while (end != original){Path.Add(end);end = path[end];}Path.Add(original);Path.Reverse();return Path;}private static string DisPlayPath(List<int> paths){string s = null;foreach (var path in paths){s += path;}return s;}}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Dijkstra;
public class TestDijkstra : MonoBehaviour
{Graph graph;void Start(){Vertex[] vertexs = GenerateVertex(9);Edge[] edges = GenerateEdges();graph = new Graph(vertexs, edges);Graph.Dijkstra(graph,0);}private Vertex[] GenerateVertex(int len){Vertex[] vertexs = new Vertex[len];for (int i = 0; i < len; i++){vertexs[i] = new Vertex(i);}return vertexs;}private Edge[] GenerateEdges(){Edge edge0 = new Edge(0, 1, 1);Edge edge1 = new Edge(0, 2, 5);Edge edge2 = new Edge(1, 2, 3);Edge edge3 = new Edge(1, 3, 7);Edge edge4 = new Edge(1, 4, 5);Edge edge5 = new Edge(2, 4, 1);Edge edge6 = new Edge(2, 5, 7);Edge edge7 = new Edge(3, 4, 2);Edge edge8 = new Edge(3, 6, 3);Edge edge9 = new Edge(4, 5, 3);Edge edge10 = new Edge(4, 6, 6);Edge edge11 = new Edge(4, 7, 9);Edge edge12 = new Edge(5, 7, 5);Edge edge13 = new Edge(6, 7, 2);Edge edge14 = new Edge(6, 8, 7);Edge edge15 = new Edge(7, 8, 4);Edge[] edges = { edge0, edge1, edge2, edge3, edge4, edge5, edge6, edge7, edge8, edge9, edge10, edge11, edge12, edge13, edge14,edge15 };return edges;}
}

最短路径-迪杰斯特拉(Dijkstra)相关推荐

  1. c语言迪杰斯特拉算法求最短路径,迪杰斯特拉 ( Dijkstra ) 最短路径算法

    迪杰斯特拉算法介绍 迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径.它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止. 基本 ...

  2. 最短路径 - 迪杰斯特拉(Dijkstra)算法

    对于网图来说,最短路径,是指两顶点之间经过的边上权值之和最少的路径,并且我们称路径上的第一个顶点为源点,最后一个顶点为终点.最短路径的算法主要有迪杰斯特拉(Dijkstra)算法和弗洛伊德(Floyd ...

  3. 数据结构与算法(7-4)最短路径(迪杰斯特拉(Dijkstra)算法、弗洛伊德(Floyd)算法)

    目录 一.最短路径概念 二.迪杰斯特拉(Dijkstra)算法(单源最短路径) 1.原理 2.过程 3.代码 三.弗洛伊德(Floyd)算法(多源最短路径) 1.原理 2.存储 3.遍历 4.代码 参 ...

  4. 059.迪杰斯特拉(Dijkstra)算法的原理以及解决最短路径问题

    1. 迪杰斯特拉(Dijkstra)算法的原理 1.1. 算法应用场景-最短路径问题 1.2. 基本介绍 1.3. 步骤详解 1.4. 思路解析 1.5. 图解步骤 2. 迪杰斯特拉(Dijkstra ...

  5. 简述dijkstra算法原理_理解最短路径——迪杰斯特拉(dijkstra)算法

    1.       迪杰斯特拉算法简介 迪杰斯特拉(dijkstra)算法是典型的用来解决最短路径的算法,也是很多教程中的范例,由荷兰计算机科学家狄克斯特拉于1959年提出,用来求得从起始点到其他所有点 ...

  6. 迪杰斯特拉(Dijkstra)算法解决最短路径问题

    Dijkstra 算法介绍 迪杰斯特拉算法(Dijkstra)是由荷兰计算机科学家狄克斯特拉于1959年提出的,因此又叫狄克斯特拉算法.迪杰斯特拉(Dijkstra)算法是最经典的最短路径算法之一,用 ...

  7. 最短路径算法-迪杰斯特拉(Dijkstra)算法

    最短路径算法-迪杰斯特拉(Dijkstra)算法 迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径. 它的主要特点是以起始点为中心向外层层扩展(广度优先遍历思 ...

  8. java数据结构和算法——迪杰斯特拉(Dijkstra)算法

    目录 一.迪杰斯特拉(Dijkstra)算法介绍 二.迪杰斯特拉(Dijkstra)算法过程 三.迪杰斯特拉(Dijkstra)算法--应用场景(最短路径问题) 四.迪杰斯特拉(Dijkstra)算法 ...

  9. 【图】最短路径--迪杰斯特拉(Dijkdtra)算法

    迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径. 它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止. 算法思想 每次找到离源 ...

  10. Java迪杰斯特拉(Dijkstra)算法与弗洛伊德(Floyd)算法

    1.Java迪杰斯特拉(Dijkstra)算法与弗洛伊德(Floyd)算法 1.1 迪杰斯特拉(Dijkstra)算法 1.1.1 迪杰斯特拉(Dijkstra)算法介绍 迪杰斯特拉(Dijkstra ...

最新文章

  1. 汇编语言介绍,内存和总线的初步认识
  2. 返回1到n的所有组合python_如何在Python中生成0-1矩阵的所有可能组合?
  3. 【HDU - 5878】I Count Two Three(打表)
  4. Android基础巩固进阶
  5. 如意淘商品推荐技术介绍之一:基础推荐
  6. 稳定同位素(stable isotope)标记氨基酸,聚氨基酸,PEI,聚合物,抑制剂,离子液体,石墨烯,黑磷,透明质酸,荧光材料,脂质体复合物
  7. 杜邦线改成焊线_排线和杜邦线有什么区别
  8. 计算智能——密码分析:面向对象的分析与设计之Use Cace图
  9. Linux系统备份与还原-Clonezilla
  10. 怎么识别手写的文字?办公常备软件说明
  11. qt设置背景图片注意事项
  12. 老李的博客在这里安家了
  13. (转)C++进程间和线程间通信
  14. zookeeper:[WorkerSender[myid=2]:QuorumCnxManager@584] - Cannot open channel to 3 at election address
  15. 学python怎么赚钱-有编程基础学python怎么赚点小钱?
  16. 如何使用手机里的Windows系统云桌面?
  17. 计算机的输出原理,计算机原理及系统结构 输入输出设备.ppt
  18. .NAT和PAT的区别
  19. python爬虫,Scrapy爬取豆瓣电影《芳华》电影短评,分词生成词云图。
  20. mits6.081_lab1

热门文章

  1. 软件测试 | 生命周期
  2. 牛客练习赛51 C 勾股定理 (结论题)
  3. EXECL打开密码暴力破解
  4. 自学数据结构_五月十日_综述
  5. js二分法的简单计算
  6. 计算机专业要考什么证书?
  7. 小型RTK/LITE RTK/Mini RTK CR202(9P+4G+imu) 惯导 实现高精度厘米级定位,输出组合导航位置,定位数据回传服务器
  8. 最新系统漏洞--UnRAR堆缓冲区溢出漏洞
  9. ChinaSoft 论坛巡礼 | 编译器与编程语言
  10. Linux下添加FTP账号和服务器、增加密码和用户,更改FTP目录