dijkstra该算法主要应用在求解最短路径,从最近点开始,广度搜索。
假设有向图中有10个顶点,求其中某个顶点a到其它顶点的最短路径。。满足贪心算法的2个标准。时间复杂度为O(N2)
此问题可以进行分解。某个顶点a到到其他顶点c必定是从a直接到c 或者是从a到离a最近的顶点b,再到c。
算法思想:
初始化:
d[] 已计算顶点集合      初始为原点a
s[]  待计算顶点集合     初始为除了a外其他顶点
minlen[]  每次找到的最近点与其它点s[]的距离
过程:
从a点开始,遍历与其他顶点(s[])的距离minlen[]。找到距离a点最近的顶点(x) 把x加到d[]中,s[]中减去,并更新minlen[]中距离
重复这个过程。
所以是两个for循环嵌套,时间复杂度为O(n2)
参照百度cijkstra java写的代码,看到很少有c#的 ,就写了个。
   static void Main(string[] args)
{
double[,] path = getpath();//随机生成10个点之间的距离矩阵
Dictionary<int, double> result = getr(path);//result<点,距离> }
public static Dictionary<int, double> getr(double[,] da)
{
Dictionary<int, double> result = new Dictionary<int, double>();
result.Add(, ); //默认添加首点
int n =Convert.ToInt32(Math.Sqrt(da.Length));
double[] minlen =new double[n];//存储每次找到的最近点距离其它点的距离
int[] visit =new int[n]; //一共0到9点 计算过后的点为1
for(int i=;i<n;i++){
minlen[i] = da[, i];//初始化首点与其它点距离
}
visit[] = ; //默认第一点为原点,已经添加到visit集合
int minj = ; //遍历循环默认第一点最小
for (int i = ; i < n; i++) {
double min = double.PositiveInfinity;
for (int j =; j < n ; j++) {
if (visit[j] == && minlen[j] < min) {//遍历minlen 找到最小
min = minlen[j];//j循环最小值
minj = j; //第minj最小
}
}
if (min == double.PositiveInfinity) return result;//测试数据有可能出现x点到其它点没有距离
visit[minj] = ; //第minj点已添加
result.Add(minj,min);
for (int j = ; j < n ; j++)//重新计算minlen
{
if (visit[j] == && minlen[minj] !=double.PositiveInfinity
&& da[minj,j] != double.PositiveInfinity
&& minlen[j] > (minlen[minj] + da[minj,j]))
{
minlen[j] = minlen[minj] + da[minj,j];
}
}
}
return result;
}
public static double[,] getpath(int num) {
Random rd=new Random();
double[,] path = new double[num, num];
for (int i = ; i < num; i++)
{
for (int j = ; j < num; j++)
{
path[i, j] = rd.Next(,);//生成测试数据
if (path[i, j] > || i == j) path[i, j] = double.PositiveInfinity;
}
}
return path;
}

对dijkstra算法的自我理解,c#例子的更多相关文章

  1. 关于dijkstra算法的一点理解

    最近在准备ccf,各种补算法,图的算法基本差不多看了一遍.今天看的是Dijkstra算法,这个算法有点难理解,如果不深入想的话想要搞明白还是不容易的.弄了一个晚自习,先看书大致明白了原理,就根据书上的 ...

  2. 迪杰斯特拉(Dijkstra)算法描述及理解

    Dijkstra算法是一种计算单源最短无负边路径问题的常用算法之一,时间复杂度为O(n2) 算法描述如下:dis[v]表示s到v的距离,pre[v]为v的前驱结点,用以输出路径,vis[v]表示该点最 ...

  3. dijkstra算法:寻找到全图各点的最短路径

    dijkstra算法介绍:即迪杰斯特拉算法,是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题.迪杰斯特拉算法主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止,是一种广度优先 ...

  4. 一步一步深入理解Dijkstra算法

    先简单介绍一下最短路径: 最短路径是啥?就是一个带边值的图中从某一个顶点到另外一个顶点的最短路径. 官方定义:对于内网图而言,最短路径是指两顶点之间经过的边上权值之和最小的路径. 并且我们称路径上的第 ...

  5. 理解最短路径-Dijkstra算法

    最短路径—Dijkstra算法和Floyd算法 透彻理解迪杰斯特拉算法 Dijkstra算法的使用条件:图中不存在负权边. ---------------------------有待验证------- ...

  6. 通俗易懂理解——dijkstra算法求最短路径

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

  7. Dijkstra算法优先队列实现与Bellman_Ford队列实现的理解

    /* Dijkstra算法用优先队列来实现,实现了每一条边最多遍历一次. 要知道,我们从队列头部找到的都是到 已经"建好树"的最短距离以及该节点编号, 并由该节点去更新 树根 到其 ...

  8. 最短路:我的理解--Dijkstra算法

    最短路径:Dijkstra算法 用来计算从一个点到其他所有点的最短路径的算法,是一种单源最短路径算法.也就是说,只能计算起点只有一个的情况. Dijkstra的时间复杂度是O (N2),它不能处理存在 ...

  9. dijkstra算法理解+模板

    2017-09-17 21:10:45 writer:pprp 看了看dijkstra算法,用自己语言总结一下主要过程吧, 首先,明确这个算法用处是在于计算单源最短路径问题并且边权非负,给出一个起点可 ...

随机推荐

  1. Python基础篇【第3篇】: Python异常处理、反射、动态导入、利用反射的web框架

    异常处理 什么是异常? 异常即是一个事件,该事件会在程序执行过程中发生,影响了程序的正常执行. 一般情况下,在Python无法正常处理程序时就会发生一个异常.异常是Python对象,表示一个错误.当P ...

  2. scichart by Kline

    <UserControl x:Class="Abt.Controls.SciChart.Example.Examples.IWantTo.CreateMultiseriesChart. ...

  3. 测不准的程序员(Heisenberg Developers)

    摘译自http://mikehadlow.blogspot.co.uk/2014/06/heisenberg-developers.html   ——“你无法在不改变他们状态的情况下观察一个开发者” ...

  4. range for query

    static void range_test(Args _args) { Query                   Query; QueryRun                QueryRun ...

  5. Access数据库的模糊查询到底是用*还是%

    今天被用了一下Access数据库,结果被它的模糊查询给折腾了一上午,到底是用*还是%?特此记下来 事情是这样的,我用C#写了个小的窗体程序,访问Access数据库进行一个模糊查询,我先手工往Acces ...

  6. onethink入门笔记(二)

    5.onethink页面端获得后台服务器传值的方法 1:一般后台通过assign的值前台通过{$value}显示出来; 2:如果需要在js中使用 则可以通过 在js中写 var m = "{ ...

  7. python中获取上一个月一号的方法

    业务场景: 我们经常会跑一些月级别或者周级别的报表. 周级别的报表还比较好确定,就是七天前的直接用timedelta(days=7)来获取开始日期就可以了; 但是月级别的报表就要麻烦一些,因为time ...

  8. CSS 单行溢出文本显示省略号...的方法(兼容IE FF)(转)

    http://www.52css.com/article.asp?id=602 ===================================================     html ...

  9. 基于纹理的图片检索及demo(未启动)

    基于纹理的图片检索及demo(未启动)

  10. c++程序设计之编程思想

    代码块愈小,代码的功能就愈容易管理,代码的处理和移动就愈轻松. 任何一个傻瓜都能写出计算机可以理解的代码,唯有写出人类容易理解的代码,才是优秀的程序员. 绝大多数情况下,函数应该放在它所使用的数据的所 ...