C#用迪杰斯特拉算法(Dijkst)求最短路径
的有关信息介绍如下:Dijkst求最短路径的算法(在无向图中找到从起点到其他各个定点的最短路径)简单直接易理解,今天我就用Csharp程序设计求最短路径的算法,使用到了“ABCDEF”留个点,以及每个点的不同权值。
我要做这个算法,首先要理解迪杰斯特拉算法。然后能画图程序执行流程图,这里我就做了个简单的流程图
创建一个Windows窗体程序,程序界面如下。
pictureBox1控件显示算法用到的基础数据图片;
comboBox1设置算法的起点,默认"A";
算法检验按钮(btn_JY),执行算法。
首先创建一个类“Dijskst_shixian.cs”,用来设计迪杰斯特拉算法的实现。
在类Dijskst_shixian.cs中定义了一个结构Node,这个节点记录点和权值。
public struct Node
{
public string Node_Name;
public int Node_QuanZhi;
}
创建一个泛型对象:public List> node_List = new List
>(); 记录节点和权值。
用create()方法创建图的邻接点
public void Create() {
node_List = new List>();
List
nn = new List
Node node = new Node();
node.Node_QuanZhi = 0;
node.Node_Name = "A";
nn.Add(node);
Node node1 = new Node();
node1.Node_QuanZhi = 6;
node1.Node_Name = "B";
nn.Add(node1);
Node node2 = new Node();
node2.Node_QuanZhi = 3;
node2.Node_Name = "C";
nn.Add(node2);
node_List.Add(nn);
nn = new List
Node N = new Node();
N.Node_Name = "B";
N.Node_QuanZhi = 0;
nn.Add(N);
Node N1 = new Node();
N1.Node_Name = "A";
N1.Node_QuanZhi = 6;
nn.Add(N1);
Node N2 = new Node();
N2.Node_Name = "C";
N2.Node_QuanZhi = 2;
nn.Add(N2);
Node N3 = new Node();
N3.Node_Name = "D";
N3.Node_QuanZhi = 5;
nn.Add(N3);
node_List.Add(nn);
nn = new List
Node NN = new Node();
NN.Node_Name = "C";
NN.Node_QuanZhi = 0;
nn.Add(NN);
Node NN1 = new Node();
NN1.Node_Name = "A";
NN1.Node_QuanZhi = 3;
nn.Add(NN1);
Node NN2= new Node();
NN2.Node_Name = "B";
NN2.Node_QuanZhi = 2;
nn.Add(NN2);
Node NN3 = new Node();
NN3.Node_Name = "D";
NN3.Node_QuanZhi = 3;
nn.Add(NN3);
Node NN4 = new Node();
NN4.Node_Name = "E";
NN4.Node_QuanZhi = 4;
nn.Add(NN4);
node_List.Add(nn);
nn = new List
Node NNN = new Node();
NNN.Node_Name = "D";
NNN.Node_QuanZhi = 0;
nn.Add(NNN);
Node NNN1 = new Node();
NNN1.Node_Name = "B";
NNN1.Node_QuanZhi = 5;
nn.Add(NNN1);
Node NNN2 = new Node();
NNN2.Node_Name = "C";
NNN2.Node_QuanZhi = 3;
nn.Add(NNN2);
Node NNN3 = new Node();
NNN3.Node_Name = "E";
NNN3.Node_QuanZhi = 2;
nn.Add(NNN3);
Node NNN4 = new Node();
NNN4.Node_Name = "F";
NNN4.Node_QuanZhi = 4;
nn.Add(NNN4);
node_List.Add(nn);
nn = new List
Node NNNN = new Node();
NNNN.Node_Name = "E";
NNNN.Node_QuanZhi = 0;
nn.Add(NNNN);
Node NNNN1 = new Node();
NNNN1.Node_Name = "D";
NNNN1.Node_QuanZhi = 2;
nn.Add(NNNN1);
Node NNNN2 = new Node();
NNNN2.Node_Name = "C";
NNNN2.Node_QuanZhi = 4;
nn.Add(NNNN2);
Node NNNN3 = new Node();
NNNN3.Node_Name = "F";
NNNN3.Node_QuanZhi = 5;
nn.Add(NNNN3);
node_List.Add(nn);
nn = new List
Node NNNNN = new Node();
NNNNN.Node_Name = "F";
NNNNN.Node_QuanZhi = 0;
nn.Add(NNNNN);
Node NNNNN1 = new Node();
NNNNN1.Node_Name = "D";
NNNNN1.Node_QuanZhi = 3;
nn.Add(NNNNN1);
Node NNNNN2 = new Node();
NNNNN2.Node_Name = "E";
NNNNN2.Node_QuanZhi = 5;
nn.Add(NNNNN2);
node_List.Add(nn);
nn = new List
Node NNNNNN = new Node();
NNNNNN.Node_Name = "G";
NNNNNN.Node_QuanZhi = 0;
nn.Add(NNNNNN);
Node NNNNNN1 = new Node();
NNNNNN1.Node_Name = "D";
NNNNNN1.Node_QuanZhi = 2;
nn.Add(NNNNNN1);
Node NNNNNN2 = new Node();
NNNNNN2.Node_Name = "F";
NNNNNN2.Node_QuanZhi = 3;
nn.Add(NNNNNN2);
node_List.Add(nn);
}
核心算法:
List
List
public List
public List
public void SuanFa(Node dingdian,List> ListListNode) {
WeiChuLiDingDian.Clear();
for (int I = 0; I < ListListNode.Count;I++ )
WeiChuLiDingDian.Add(ListListNode[I].Node_Name); ChuLiDian.Clear();
LJ.Clear();
LJ_Path.Clear();
LJ_Path.Add(dingdian.Node_Name+"->"+dingdian.Node_Name); dingdian.Node_QuanZhi = 0;
LJ.Add(dingdian);
ChuLiDian.Add(dingdian.Node_Name);
WeiChuLiDingDian.Remove(dingdian.Node_Name);
int ChangDu = ListListNode.Count;
for (int i = 0; i < ChangDu; i++)
{
for (int dd = 0; dd < ChangDu; dd++)
{
if (ListListNode[dd].Node_Name == dingdian.Node_Name) {
//第一步:从邻接图顶点中找到最小距离
// int min = dingdian.Node_QuanZhi + node_List[dd].Node_QuanZhi;
int min = 10000;
Node xunzhao_node=new Node();
xunzhao_node.Node_Name = "";
string path = "";
// xunzhao_node.Node_Name = ListListNode[dd].Node_Name;
for (int ljd = 1; ljd < ListListNode[dd].Count; ljd++) {
if (WeiChuLiDingDian.Contains(ListListNode[dd][ljd].Node_Name)) {
if (dingdian.Node_QuanZhi + ListListNode[dd][ljd].Node_QuanZhi < min)
{
min = dingdian.Node_QuanZhi + ListListNode[dd][ljd].Node_QuanZhi;
xunzhao_node.Node_QuanZhi = min; xunzhao_node.Node_Name = ListListNode[dd][ljd].Node_Name;
path = LJ_Path[LJ_Path.Count - 1] + "->" + xunzhao_node.Node_Name;
}
}
}
if (xunzhao_node.Node_Name == "")
{
if(WeiChuLiDingDian.Count>0)
xunzhao_node.Node_Name = WeiChuLiDingDian; path = xunzhao_node.Node_Name;
} //寻找到了从顶点到邻接点最小距离,之后再从找到的点寻找邻接点
for (int xunzhaodaodian = 0; xunzhaodaodian < ChangDu; xunzhaodaodian++)
{
if (ListListNode[xunzhaodaodian].Node_Name == xunzhao_node.Node_Name)
{
for (int xzd_ljd = 1; xzd_ljd < ListListNode[xunzhaodaodian].Count; xzd_ljd++)
{
for(int lj=0;lj if (ListListNode[xunzhaodaodian][xzd_ljd].Node_Name == LJ[lj].Node_Name) { int minmin=LJ[lj].Node_QuanZhi+ ListListNode[xunzhaodaodian][xzd_ljd].Node_QuanZhi; if (min > minmin) { min = minmin; xunzhao_node.Node_QuanZhi = minmin; path = LJ_Path[lj] + "->" + xunzhao_node.Node_Name; } } } } } //查找成功 dingdian = xunzhao_node; LJ.Add(dingdian); ChuLiDian.Add(dingdian.Node_Name); WeiChuLiDingDian.Remove(dingdian.Node_Name); LJ_Path.Add(path); continue; } } } } 算法检验设计代码: 创建一个对象:Dijskst_shixian dijs = new Dijskst_shixian(); 默认节点"A": if (comboBox1.Text != "") node.Node_Name = comboBox1.Text; else node.Node_Name = "A"; 执行创建和算法函数 dijs.Create();dijs.SuanFa(node,dijs.node_List); 显示输出信息: for (int i = 0; i < dijs.LJ.Count-1; i++) { richTextBox1.AppendText("起点"+node.Node_Name+"到顶点:"+dijs.LJ[i].Node_Name + " ;最短路径: " + dijs.LJ[i].Node_QuanZhi+" ; 路径: "+dijs.LJ_Path[i]+" ;\r\n"); } 运行编译程序,执行“算法检验”,默认“A”为起点,计算A到其他点的最短路径,执行结果在红框中。 运行编译程序,执行“算法检验”,选择以“C”为起点,计算C到其他点的最短路径,执行结果在红框中。