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. win7、linux安装使用pip、mitmproxy

    安装pip https://pip.pypa.io/en/latest/installing.html 步骤: 下载 https://bootstrap.pypa.io/get-pip.py pyth ...

  2. nginx日志分割脚本

    [root@localhost nginx]# cat logs/nginx.pid 5118[root@localhost nginx]# kill -QUIT 5118-QUIT : 关闭进程-H ...

  3. GHOST(幽灵)重大漏洞

    cd /usr/local/srcwget https://webshare.uchicago.edu/orgs/ITServices/itsec/Downloads/GHOST.cgcc GHOST ...

  4. 十五、polygon API

    How polygons are handled internally The five basic polygonal API classes Construction History and Tw ...

  5. vs2010 打包 SQL server compact 4.0 驱动程序

    sqlce 3.5应该是.net3.5环境下的.不知道最初的时候数据库的创建是用的3.5还是4.0 .这两天测试的时候,将4.0卸载了.就运行不上.报错为“未能加载文件或程序集“System.Data ...

  6. onethink入门笔记(二)

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

  7. 优化servlet

    在最开始的时候我们写一个servlet(LoginServlet)对应一个请求(Login.jsp),这样的话就会产生很多的servlet,使其以后维护变得麻烦,所以我们可以考虑将同一类型(Login ...

  8. Delphi 调用Dll的两种方式

    unit Unit1; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System ...

  9. Cacti修改采集精度为1分钟

    前言: 基础知识:建议先了解一下 rrdtool 及 rrd 数据库的工作原理,参考阅读<rrdtool学习笔记> cacti主要使用了rrdtool这个工具来绘图,所以看上去比zabbi ...

  10. UITableViewCell重用导致内容混乱方案

    UITableViewCell *cell=nil; static NSString *reuse=@"cell"; if (cell==nil) { cell=[[UITable ...