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版)
上篇博客我们详细的介绍了两种经典的最小生成树的算法,本篇博客我们就来详细的讲一下最短路径的经典算法----迪杰斯特拉算法.首先我们先聊一下什么是最短路径,这个还是比较好理解的.比如我要从北京到济南,而 ...
随机推荐
- Angular2入门系列教程4-服务
上一篇文章 Angular2入门系列教程-多个组件,主从关系 在编程中,我们通常会将数据提供单独分离出来,以免在编写程序的过程中反复复制粘贴数据请求的代码 Angular2中提供了依赖注入的概念,使得 ...
- HttpClient的替代者 - RestTemplate
需要的包 ,除了Spring的基础包外还用到json的包,这里的数据传输使用json格式 客户端和服务端都用到一下的包 <!-- Spring --> <dependency> ...
- ASP.NET Aries 入门开发教程2:配置出一个简单的列表页面
前言: 朋友们都期待我稳定地工作,但创业公司若要躺下,也非意念可控. 若人生注定了风雨飘摇,那就雨中前行了. 最机开始看聊新的工作机会,欢迎推荐,创业公司也可! 同时,趁着自由时间,抓紧把这系列教程给 ...
- Js new到底发生了什么
在Js中,我们使用了new关键字来进行实例化 那么在这个new的过程中到底发生了什么? 关于构造函数的return 正常来讲构造函数中是不用写return语句的,因为它会默认返回新创建的对象. 但是, ...
- iOS---iOS10适配iOS当前所有系统的远程推送
一.iOS推送通知简介 众所周知苹果的推送通知从iOS3开始出现, 每一年都会更新一些新的用法. 譬如iOS7出现的Silent remote notifications(远程静默推送), iOS8出 ...
- 前端学HTTP之Web主机托管
前面的话 对内容资源的存储.协调以及管理的职责统称为Web主机托管.主机托管是Web服务器的主要功能之一.保存并提供内容,记录对内容的访问以及管理内容都离不开服务器.如果不想自行管理服务器所需的软硬件 ...
- 创建 OVS Local Network - 每天5分钟玩转 OpenStack(129)
上一节我们完成了 OVS 的准备工作,本节从最基础的 local network 开始学习.local network 不会与宿主机的任何物理网卡连接,流量只被限制在宿主机内,同时也不关联任何的 VL ...
- 启用 Open vSwitch - 每天5分钟玩转 OpenStack(127)
Linux Bridge 和 Open vSwitch 是目前 OpenStack 中使用最广泛的两种虚机交换机技术. 前面各章节我们已经学习了如何用 Linux Bridge 作为 ML2 mech ...
- 讓TQ2440也用上設備樹(1)
作者:彭東林 郵箱:pengdonglin137@163.com QQ:405728433 開發板 TQ2440 + 64MB 內存 + 256MB Nand 軟件 Linux: Linux-4.9 ...
- 关于.NET参数传递方式的思考
年关将近,整个人已经没有了工作和写作的激情,估计这个时候很多人跟我差不多,该相亲的相亲,该聚会喝酒的聚会喝酒,总之就是没有了干活的心思(我有很多想法,但就是叫不动我的手脚,所以我只能看着别人在做我想做 ...