Dijkstra算法C#实现

原创 2013年12月02日 09:29:43
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;


namespace Dijkstra算法
{
    public enum zm
    {
        A = 0,
        B = 1,
        C = 2,
        D = 3,
        E = 4,
        F = 5
    }
    struct MGraph
    {
        public int[,] edges;
        public int n, e;
    }
    //S集合
    public class Sset
    {
        public List<int> list;
        public Dictionary<string, int> dic;
        public Sset()
        {
            list = new List<int>();
            dic = new Dictionary<string, int>();
        }
    }
    public class GraphClass
    {
        const int MAXV = 100;
        const int INF = 32767;
        MGraph g = new MGraph();
        private Sset sset = new Sset();//s集合
        private List<int> uList = new List<int>();//u集合
        public GraphClass()
        {
            g.edges = new int[MAXV, MAXV];
        }
        /// <summary>
        /// 创建图的矩阵
        /// </summary>
        /// <param name="n">顶点数</param>
        /// <param name="e">边数</param>
        /// <param name="a">图的矩阵存储</param>
        public void CreateMGraph(int n, int e, int[,] a)
        {
            g.n = n;
            g.e = e;
            for (int i = 0; i < g.n; i++)
            {
                uList.Add(i);
                for (int j = 0; j < g.n; j++)
                {
                    g.edges[i, j] = a[i, j];
                }
            }
        }
        /// <summary>
        /// 图的矩阵输出
        /// </summary>
        /// <returns></returns>
        public string DispMGraph()
        {
            string mystr = string.Empty;
            for (int i = 0; i < g.n; i++)
            {
                if (i == 0)
                {
                    mystr += "   A   B   C   D   E   F\r\n";
                }
                for (int j = 0; j < g.n; j++)
                {
                    if (j == 0)
                    {
                        mystr += (zm)i + "  ";
                    }
                    mystr += string.Format("{0,-4}", g.edges[i, j].ToString());
                }
                mystr += "\r\n";
            }
            return mystr;
        }
        /// <summary>
        /// Dijkstra算法
        /// </summary>
        public void Dijkstra()
        {
            sset.list.Add(0);
            sset.dic.Add("0", 0);
            sset.dic.Add("0-0", 0);
            int max = 100000;
            int uListPostion = 0;
            string path = string.Empty;
            while (uList.Count > 1)
            {
                foreach (KeyValuePair<string, int> item in sset.dic)
                {
                    string[] temp = item.Key.Split('-');
                    int last = Convert.ToInt32(temp[temp.Length - 1]);
                    for (int i = 0; i < uList.Count; i++)
                    {
                        if (!temp.Contains(uList[i].ToString()))
                        {
                            if (g.edges[last, uList[i]] != -1 && g.edges[last, uList[i]] != 0 && (g.edges[last, uList[i]] + item.Value) < max)
                            {
                                max = g.edges[last, uList[i]];
                                uListPostion = i;
                                path = item.Key;
                            }
                        }
                    }
                }
                sset.list.Add(uList[uListPostion]);
                sset.dic.Add(path + "-" + uList[uListPostion], max + sset.dic[path]);
                uList.Remove(uList[uListPostion]);
                max = 100000;
            }
            //输出路线和相应的距离
            foreach (KeyValuePair<string, int> item in sset.dic)
            {
                string[] temp = item.Key.Split('-');
                string consolestring = "";
                foreach (string itemstr in temp)
                {
                    consolestring += (zm)(Convert.ToInt32(itemstr)) + "-";
                }
                consolestring = consolestring.Remove(consolestring.LastIndexOf('-'));
                Console.WriteLine(consolestring + "  距离:" + item.Value);
            }
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            int n = 6, en = 9;
            //-1表示不可达
            int[,] a = new int[,] { { 0, 6, 3, -1, -1, -1 }, { 6, 0, 2, 5, -1, -1 }, { 3, 2, 0, 3, 4, -1 }, { -1, 5, 3, 0, 2, 3 }, { -1, -1, 4, 2, 0, 5 }, { -1, -1, -1, 3, 5, 0 } };
            GraphClass gc = new GraphClass();
            gc.CreateMGraph(n, en, a);
            Console.WriteLine(gc.DispMGraph());
            gc.Dijkstra();
            Console.ReadKey();
        }
    }
}

Dijkstra 最短路径算法C#实现

算法不用细说,学过数据结构的同仁们都知道,前两天用到,用C#写出来了。using System;using System.Collections.Generic;using System.Text;n...
  • chaihuo
  • chaihuo
  • 2007年10月29日 09:04
  • 8710

Dijkstra算法——C#实现版

Dijkstra算法的概念不再叙述,在这里把算法的实现记录一下。 主要用于求源点到各点的最短路径。 using System.Text; using System.Collections; using...
  • u012102306
  • u012102306
  • 2015年01月28日 02:57
  • 1094

C# 最短路径 Dijkstra算法实现示例

  • 2015年11月28日 10:54
  • 59KB
  • 下载

单源最短路径Dijkstra算法 C#

原文为C++,用C#改写了一下。 http://www.dutor.net/index.php/2010/04/shortest-path-dijkstra/ ClassNode类public...
  • lab2013
  • lab2013
  • 2011年10月03日 21:13
  • 1853

导航图寻路(三)--Dijkstra代码实现

前言前一篇我们描述了Dijkstra的算法,这篇文章中我们会将它变成c#代码。纠正几个错误 之前我们的文章中,存放边界顶点用的数组,应该是栈,这样便于代码描述,但是如果想优化速度,可以使用数组,我们将...
  • qq_22984991
  • qq_22984991
  • 2017年01月17日 16:54
  • 304

迪杰斯特拉算法C语言实现

  • 2011年11月23日 09:23
  • 3KB
  • 下载

最短路径迪杰斯特拉算法C语言实现__Dijkstra

// 采用邻接矩阵表示图 // 简单起见,邻接矩阵(图中各结点间的距离权值)在main函数中直接输入了 #include #incl...
  • ppalive_
  • ppalive_
  • 2015年08月19日 18:39
  • 5766

利用优先队列实现的dijkstra算法

dijkstra算法是典型的贪心算法,但如果没有好的数据结构支持的话,O(v^2)的效率还是让人有点不满意,不过如果利用优先队列的话就能轻松的实现O(ElogV+VlogV),对       于稀疏图...
  • u013708970
  • u013708970
  • 2014年03月15日 20:38
  • 1722

dijkstra算法java实现

这段代码是在做牛客网的编程题的时候写的,但是那道题要求出图中两点之间所有的最短路径,目前我只实现了求出一条最短路径的算法。   Vertex类存储每一个节点的信息: distance(到源点的距离,初...
  • a1057664619
  • a1057664619
  • 2016年07月18日 18:49
  • 1429

Dijkstra算法求最短路径问题完整C代码

算法基本思想和过程      单源最短路径问题,即在图中求出给定顶点到其它任一顶点的最短路径。在弄清楚如何求算单源最短路径问题之前,必须弄清楚最短路径的最优子结构性质。 一.最短路径的最优子结构性质...
  • u014488381
  • u014488381
  • 2014年11月26日 09:31
  • 10586
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Dijkstra算法C#实现
举报原因:
原因补充:

(最多只允许输入30个字)