Dijkstra最短路径算法(C#实现)

学习了最短路劲算法,就想用C#语言实现一下,算自己的总结提高,也为初学者提供帮助闲话不说,首先陈述一下dijkstra算法的思想

1、设置一个集合S,用来存放确定了最短路径的顶点,一个集合U,用来存放没有确定最短路径的顶点,一个集合distance,表示起点到该点在此刻的最短距离,

集合pre,表示该点取到当前路径时的上一个参考点,初始参考点下标都为0;集合Isfor表示是否确定已经为最短路径了。

2.先把起点V0的下标0加到集合S,然后标记Isfor[0]=true;把起点的下标标记为把V1,V2,V3,V4,V5,V6的下标123456放到U中,遍历集合U,把0到各个顶点的距离添加到distance中(没有直接相连的边,就用2048这个大数表示);

3.遍历distance,找到最小的距离,把顶点的下标添加到S中,然后设置该下标对应的Isfor的值为true,找到该下标为起点到各边的距离,如果这个新起点到其余在U集合的顶点的距离和上一个起点到新起点的距离之和<distance数据的距离,就把该位置的distance值设为(这个新起点到其余在U集合的顶点的距离和上一个起点到新起点的距离之和);然后更改该顶点的对应pre的参考下标,为上一个起点的下标;然后重复3;

附上代码:

using System;
using System.Collections;
using System.Text;
namespace DijkstraMethod
{
class Program
{
//V1到V7的邻接矩阵
static int[,] Metro = new int[7,7] {
{ 0, 3, 7, 5,2048,2048,2048},
{ 3, 0, 2,2048, 6,2048,2048},
{ 7, 2, 0, 3, 3,2048,2048},
{ 5,2048, 3, 0,2048, 2, 8},
{2048, 6, 3,2048, 0,2048, 2},
{2048,2048,2048, 2,2048, 0, 2},
{2048,2048,2048, 8, 2, 2, 0}};
static int row = 7;
ArrayList S = new ArrayList(row);//S储存确定最短路径的顶点的下标
ArrayList U = new ArrayList(row);//U中存储尚未确定路径的顶点的下标
int[] distance = new int[7];//用以每次查询存放数据
int[] prev = new int[7];//用以存储前一个最近顶点的下标
bool[] Isfor = new bool[7] { false, false, false, false, false, false, false };
/// <summary>
/// dijkstra算法的实现部分
/// </summary>
/// <param name="Start"></param>
void FindWay(int Start)
{
S.Add(Start);
Isfor[Start] = true;
for(int i=0;i<row;i++)
{
if(i!=Start)
U.Add(i);
}
for(int i=0;i<row;i++){
distance[i] = Metro[Start, i];
prev[i] = 0;
}
int Count = U.Count;
while(Count>0)
{
int min_index = (int)U[0];//假设U中第一个数存储的是最小的数的下标
foreach(int r in U)
{
if (distance[r] < distance[min_index]&&!Isfor[r])
min_index = r;
}
S.Add(min_index);//S加入这个最近的点
Isfor[min_index]=true;
U.Remove(min_index);//U中移除这个点;
foreach(int r in U)
{
//查找下一行邻接矩阵,如何距离和上一个起点的距离和与数组存储的相比比较小,就更改新的距离和起始点,再比对新的起点到各边的距离
if (distance[r] > distance[min_index] + Metro[min_index, r])
{
distance[r] = distance[min_index] + Metro[min_index, r];
prev[r] = min_index;
}
else
{
distance[r] = distance[r];
}
}
Count = U.Count;
}
}
/// <summary>
/// 把生成数据显示出来
/// </summary>
void display()
{
for(int i=0;i<row;i++)
{
Console.Write("V1到V{0}的最短路径为→V1",i);
int prePoint = prev[i];
string s = "";
StringBuilder sb = new StringBuilder(10);
while (prePoint> 0)
{
s =( prePoint + 1)+s;
prePoint = prev[prePoint];
}
for (int j = 0; j < s.Length;j++ )
{
sb.Append("-V").Append(s[j]);
}
Console.Write(sb.ToString());
Console.Write("-V{0}", i );
Console.WriteLine(":{0}",distance[i]);

}
}
static void Main(string[] args)
{
Program p = new Program();
p.FindWay(0);
p.display();
Console.ReadKey();
}
}
}

时间: 2024-11-09 17:51:05

Dijkstra最短路径算法(C#实现)的相关文章

Dijkstra最短路径算法[贪心]

Dijkstra算法的标记和结构与prim算法的用法十分相似.它们两者都会从余下顶点的优先队列中选择下一个顶点来构造一颗扩展树.但千万不要把它们混淆了.它们解决的是不同的问题,因此,所操作的优先级也是以不同的方式计算的:Dijkstra算法比较路径的长度,因此必须把边的权重相加,而prim算法则直接比较给定的权重. 源最短路径问题给定一个带权有向图 G=(V,E) ,其中每条边的权是一个非负实数.另外,还给定 V 中的一个顶点,称为源.现在我们要计算从源到所有其他各顶点的最短路径长度.这里的长度

Dijkstra最短路径算法

求下图中的1号顶点到2.3.4.5.6号顶点的最短路径. 与Floyd-Warshall算法一样这里仍然使用二维数组e来存储顶点之间边的关系,初始值如下. 我们还需要用一个一维数组dis来存储1号顶点到其余各个顶点的初始路程,如下. 我们将此时dis数组中的值称为最短路的“估计值”. 既然是求1号顶点到其余各个顶点的最短路程,那就先找一个离1号顶点最近的顶点.通过数组dis可知当前离1号顶点最近是2号顶点.当选择了2号顶点后,dis[2]的值就已经从“估计值”变为了“确定值”,即1号顶点到2号顶

【算法日记】Dijkstra最短路径算法

上一篇再说广度优先搜索的适合提到了图. 狄克斯拉特算法是在图的基础上增加了 加权图的概念.就是节点和节点之间是有不同距离的 1.算法实例 用Dijkstra算法找出以A为起点的单源最短路径步骤如下 算法实现 # Dijkstra算法--通过边实现松弛 # 指定一个点到其他各顶点的路径--单源最短路径 # 初始化图参数 G = {1:{1:0, 2:1, 3:12}, 2:{2:0, 3:9, 4:3}, 3:{3:0, 5:5}, 4:{3:4, 4:0, 5:13, 6:15}, 5:{5:0

Dijkstra 最短路径算法 秒懂详解

想必大家一定会Floyd了吧,Floyd只要暴力的三个for就可以出来,代码好背,也好理解,但缺点就是时间复杂度高是O(n³). 于是今天就给大家带来一种时间复杂度是O(n²),的算法:Dijkstra(迪杰斯特拉). 这个算法所求的是单源最短路,好比说你写好了Dijkstra的函数,那么只要输入点a的编号,就可算出图上每个点到这个点的距离. 我先上一组数据(这是无向图): 5 6 1 2 5 1 3 8 2 3 1 2 4 3 4 5 7 2 5 2 图大概是这个样子: 我们以1为源点,来求所

dijkstra 最短路径算法

Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Dijkstra算法能得出最短路径的最优解,但由于它遍历计算的节点很多,所以效率低. Dijkstra算法是很有代表性的最短路算法,在很多专业课程中都作为基本内容有详细的介绍,如数据结构,图论,运筹学等等. 其基本思想是,设置顶点集合S并不断地作贪心选择来扩充这个集合.一个顶点属于集合S当且仅当从源到该顶点的最短路径长度已知. 初始时,S

Dijkstra 最短路径算法详解 无向图

对于最短路径问题,这里介绍一种O(N^2)的求解方法. 对于求最短路径的问题一般都会给出一幅图,或者边与边的关系.如上图. 假设我们起点是A,我们要求到F的最短距离,我们会怎么做? 首先,因为A是起点,所以我们把对于每个点都有个参数,相对于A的距离,默认除了A到A为0,其他都是无穷大. 从起点A开始,我们更新与A相连通的点到A的距离,并把A点标记.如图: 我们遍历一次所有点与A的距离,找到最小的,这里是点B. 以它为起点,把它周围未被标记的点拿来做比较,显然,像F这种没有与A练过的点,当前距离就

17.boost dijkstra最短路径算法

到某个点的最短距离                到终点的最短路径 完整代码 1 #include <iostream> 2 #include <string> 3 #include <utility> 4 #include <vector> 5 #include <deque> 6 #include <boost/graph/adjacency_list.hpp> 7 //A*寻路算法 8 #include <boost\gr

【转】Fibonacci 斐波纳契堆优化 Dijkstra 最短路径算法

话不多说,拿来主义,直接上代码! PS:打印最短路径我还不晓得怎么加,如有哪位大神知道,还请mark一下! 1 /*********************************************************************** 2 * File: FibonacciHeap.java 3 * Author: Keith Schwarz ([email protected]) 4 * 5 * An implementation of a priority queue

最短路径算法学习总结

Dijkstra最短路径算法: dijkstra 算法的优点在于可以求出从一点到所有其他点的最短距离: input: 5 71 2 101 3 201 5 302 5 102 3 54 5 204 3 30 output: 0 10 15 40 20//这是求的在这颗树中,1到所有点的最短距离 1 #include<iostream> 2 #include<cstring> 3 using namespace std; 4 const int N=1100; 5 const int