C#迪杰斯特拉算法
C#迪杰斯特拉算法##
网上有许多版本的,自己还是写一个理解点
Dijkstra.cs
public class Dijkstra
{
private List<Node> _nodes;
private List<Edge> _edges;
public Dijkstra()
{
_nodes = new List<Node>();
_edges = new List<Edge>();
}
public void InitWeights(List<Tuple<string, string, double>> weights)
{
_edges = ConvertToEdge(weights);
InitNodes();
}
public List<string> Find(string start, string end)
{
var startNode = GetNodeByName(start);
var endNode = GetNodeByName(end);
if (startNode == null || endNode == null)
{
return new List<string>();
}
var s = _nodes.Where(x => x.Name == start).ToList();
var u = _nodes.Where(x => x.Name != start).ToList();
s.ForEach(x =>
{
x.Weight = 0;
});
u.ForEach(x =>
{
x.Weight = double.PositiveInfinity;
});
while (u.Any())
{
var node = s.Last();
//更新node到x的距离
u.ForEach(x =>
{
var edge = GetEdgeByTwoNode(node, x);
if (edge != null)
{
var weights = node.GetAllWeight() + edge.Weight;
if (weights < x.Weight)
{
x.Weight = weights;
x.Parent = node;
}
}
});
//找出距离最小的
var minNode = u.OrderBy(x => x.Weight).FirstOrDefault();
s.Add(minNode);
u.Remove(minNode);
}
var paths = new Stack<string>();
while (endNode != null)
{
paths.Push(endNode.Name);
endNode = endNode.Parent;
}
//如果路劲中包含起点
if (paths.ToList().Contains(start))
{
return paths.ToList();
}
else
{
return new List<string>();
}
}
private Edge GetEdgeByTwoNode(Node start, Node end)
{
var edge = _edges.FirstOrDefault(x => x.Start == start.Name && x.End == end.Name);
if (edge == null)
{
edge = _edges.FirstOrDefault(x => x.Start == end.Name && x.End == start.Name);
}
return edge;
}
/// <summary>
/// 将权值转换成边
/// </summary>
/// <returns></returns>
private List<Edge> ConvertToEdge(List<Tuple<string, string, double>> weights)
{
var edges = new List<Edge>();
weights.ForEach(weight =>
{
edges.Add(new Edge()
{
Start = weight.Item1,
End = weight.Item2,
Weight = weight.Item3
});
});
return edges;
}
/// <summary>
/// 根据名字获取节点
/// </summary>
/// <param name="nodeName"></param>
/// <returns></returns>
private Node GetNodeByName(string nodeName)
{
return _nodes.FirstOrDefault(x => x.Name == nodeName);
}
/// <summary>
/// 初始化点
/// </summary>
private void InitNodes()
{
_edges.ForEach(weight =>
{
if (_nodes.All(x => x.Name != weight.Start))
{
_nodes.Add(new Node()
{
Name = weight.Start
});
}
if (_nodes.All(x => x.Name != weight.End))
{
_nodes.Add(new Node()
{
Name = weight.End
});
}
});
}
}
Edge.cs
//表示一条边,从Start到End的权值为多少
internal class Edge
{
public string Start
{
get; set;
}
public string End
{
get; set;
}
public double Weight
{
get; set;
}
}
Node.cs
internal class Node
{
public string Name
{
get; set;
}
public Node Parent
{
get; set;
}
/// <summary>
/// 该节点到起点的最短距离
/// </summary>
public double Weight
{
get; set;
}
public double GetAllWeight()
{
var allWeight = 0d;
var node = this;
do
{
allWeight += node.Weight;
node = node.Parent;
} while (node != null);
return allWeight;
}
}
使用如下
static void Main(string[] args)
{
var weights = new List<Tuple<string, string, double>>()
{
new Tuple<string,string,double>("A","B",12),
new Tuple<string,string,double>("A","F",16),
new Tuple<string,string,double>("A","G",14),
new Tuple<string,string,double>("B","F",7),
new Tuple<string,string,double>("B","C",10),
new Tuple<string,string,double>("G","F",9),
new Tuple<string,string,double>("G","E",8),
new Tuple<string,string,double>("F","C",6),
new Tuple<string,string,double>("F","E",2),
new Tuple<string,string,double>("C","D",3),
new Tuple<string,string,double>("C","E",5),
new Tuple<string,string,double>("E","D",4),
};
var dij = new Dijkstra();
dij.InitWeights(weights);
var path = dij.Find("D", "G");
path.ForEach(Console.WriteLine);
}
C#迪杰斯特拉算法的更多相关文章
- C++迪杰斯特拉算法求最短路径
一:算法历史 迪杰斯特拉算法是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题.迪杰斯特拉算法主要特点是以 ...
- 【算法杂谈】LJX的迪杰斯特拉算法报告
迪杰斯特拉(di jie qi)算法 这里有一张图: 假设要求从1号节点到5号节点的最短路.那么根据迪杰斯特拉算法的思想,我们先看: 节点1,从节点1出发的一共有3条路,分别是1-6.1-3.1-2. ...
- C# 迪杰斯特拉算法 Dijkstra
什么也不想说,现在直接上封装的方法: using System; using System.Collections.Concurrent; using System.Collections.Gener ...
- 迪杰斯特拉算法——PAT 1003
本文主要是将我对于我对于迪杰斯特拉算法的理解写出来,同时通过例题来希望能够加深对于算法的理解,其中有错误的地方希望大家指正. 迪杰斯特拉算法 我将这个算法理解成一个局部到整体的算法,这个方法确实越研究 ...
- dijkstra算法(迪杰斯特拉算法)
dijkstra算法(迪杰斯特拉算法) 用途:有向图最短路径问题 定义:迪杰斯特拉算法是典型的算法,一般的表述通常有两种方式,这里均采用永久和临时标号的方式,该算法要求图中不存在负权边 用永久和临时标 ...
- 迪杰斯特拉算法c语言实现
/*http://1wangxiaobo@163.com 数据结构C语言版 迪杰斯特拉算法 P189 http://1wangxiaobo@163.com 编译环境:Dev-C++ 4.9.9.2 ...
- HDU6166-Senior Pan-Dijkstra迪杰斯特拉算法(添加超源点,超汇点)+二进制划分集合-2017多校Team09
学长好久之前讲的,本来好久好久之前就要写题解的,一直都没写,懒死_(:з」∠)_ Senior Pan Time Limit: 12000/6000 MS (Java/Others) Memor ...
- Dijkstra【迪杰斯特拉算法】
有关最短路径的最后一个算法——Dijkstra 迪杰斯特拉算法是由荷兰计算机科学家迪杰斯特拉于1959 年提出的,因此又叫迪杰斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路 ...
- 算法与数据结构(六) 迪杰斯特拉算法的最短路径(Swift版)
上篇博客我们详细的介绍了两种经典的最小生成树的算法,本篇博客我们就来详细的讲一下最短路径的经典算法----迪杰斯特拉算法.首先我们先聊一下什么是最短路径,这个还是比较好理解的.比如我要从北京到济南,而 ...
随机推荐
- C++实现线程安全的单例模式
在某些应用环境下面,一个类只允许有一个实例,这就是著名的单例模式.单例模式分为懒汉模式,跟饿汉模式两种. 首先给出饿汉模式的实现 template <class T> class sing ...
- async & await 的前世今生(Updated)
async 和 await 出现在C# 5.0之后,给并行编程带来了不少的方便,特别是当在MVC中的Action也变成async之后,有点开始什么都是async的味道了.但是这也给我们编程埋下了一些隐 ...
- Jquery 搭配 css 使用,简单有效
前几篇博客中讲了Jquery的基础和点击实际,下面来说一下和css搭配着来怎么做 还是和往常一样,举个例子 好几个方块,然后设置颜色 <!DOCTYPE html PUBLIC "-/ ...
- Js 变量声明提升和函数声明提升
Js代码分为两个阶段:编译阶段和执行阶段 Js代码的编译阶段会找到所有的声明,并用合适的作用域将它们关联起来,这是词法作用域的核心内容 包括变量声明(var a)和函数声明(function a(){ ...
- Java 8 的 Nashorn 脚本引擎教程
本文为了解所有关于 Nashorn JavaScript 引擎易于理解的代码例子. Nashorn JavaScript 引擎是Java SE 8的一部分,它与其它像Google V8 (它是Goog ...
- 为.NET Core项目定义Item Template
作为这个星球上最强大的IDE,Visual Studio不仅仅提供了很多原生的特性,更重要的是它是一个可定制的IDE,比如自定义Project Template和Item Template就是一个非常 ...
- Xamarin+Prism开发详解三:Visual studio 2017 RC初体验
Visual studio 2017 RC出来一段时间了,最近有时间就想安装试试,随带分享一下安装使用体验. 1,卸载visual studio 2015 虽然可以同时安装visual studio ...
- 【NLP】十分钟快览自然语言处理学习总结
十分钟学习自然语言处理概述 作者:白宁超 2016年9月23日00:24:12 摘要:近来自然语言处理行业发展朝气蓬勃,市场应用广泛.笔者学习以来写了不少文章,文章深度层次不一,今天因为某种需要,将文 ...
- Linux杀死进程,查看进程
http://blog.csdn.net/wojiaopanpan/article/details/7286430/
- mysql数据库主从同步
环境: Mater: CentOS7.1 5.5.52-MariaDB 192.168.108.133 Slave: CentOS7.1 5.5.52-MariaDB 192.168. ...