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;
}

最新文章

  1. Android SDK 国内镜像及配置方法
  2. 加州大学伯克利分校Stat2.3x Inference 统计推断学习笔记: FINAL
  3. shell &amp;&amp; 和 || 的短路使用
  4. iOS图形处理和性能
  5. spring下载dist.zip
  6. poj 3348 Cows 求凸包面积
  7. Unity3D-RPG项目实战(1):发动机的特殊文件夹
  8. 判断android文件是否加壳
  9. BZOJ 3926: [Zjoi20150]诸神眷顾的幻想乡(后缀自动机)
  10. 自学WPF之XAML(一)概念
  11. docker 容器网络基础
  12. vue2入坑随记(一)-- 初始全家桶
  13. JavaMelody 项目性能监控和调优工具
  14. 使用samba或NFS实现文件共享
  15. select min from 连接
  16. 【java】解析java类加载与反射机制
  17. ifstream 和 ofstream 用法。
  18. 21OGNL与ValueStack(VS)-静态方法访问
  19. 从原理上搞定编码(二)-- Web编码
  20. Flutter Map&lt;String, dynamic&gt; 、List&lt;String&gt; a-z 排序

热门文章

  1. XCodeGhost 笔记
  2. cocos2dx day 2 - Sprites
  3. Druid 基础使用-操作篇(Imply )
  4. Spark1.3使用外部数据源时条件过滤只要是字符串类型的值均报错
  5. ShellExecute 使用方法
  6. Entity framework code first
  7. LoadRunner测试结果分析02 转载至zhangzhe的新浪博客
  8. django orm 操作
  9. 关于tomcat小知识
  10. PSP个人(观众界面)