迪杰斯特拉算法 计算两点之间最短距离

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

//迪杰斯特拉算法 计算两点最短距离
namespace Dijkstra
{
    class Program
    {
        /// <summary>
        /// 邻接矩阵
        /// </summary>
        private static int?[,] rectMatrix;

        /// <summary>
        /// 点 的距离
        /// </summary>
        private static int[] distanse;

        /// <summary>
        /// 访问过的点
        /// </summary>
        private static int[] visitPoints;

        /// <summary>
        /// 路径
        /// </summary>
        private static string[] path;

        /// <summary>
        /// 坐标点数量
        /// </summary>
        private static int pointNum = 10;

        /// <summary>
        /// 起始点
        /// </summary>
        private static int startPoint;

        /// <summary>
        /// 终点
        /// </summary>
        private static int endPoint;

        static void Main(string[] args)
        {
            visitPoints = new int[pointNum];
            distanse = new int[pointNum];
            path = new string[pointNum];
            initRectMatrix();
            Console.WriteLine("请输入起始点坐标:");
            string strPoint = Console.ReadLine();
            Console.WriteLine("请输入终点坐标:");
            string ePoint = Console.ReadLine();
            if (Int32.TryParse(strPoint, out startPoint) && Int32.TryParse(ePoint, out endPoint))
            {
                computePath(startPoint);
                Console.WriteLine("最佳路径:" + path[endPoint]);
                Console.WriteLine("最短距离:" + distanse[endPoint]);
                Console.ReadLine();
            }
        }

        /// <summary>
        /// 计算路径
        /// </summary>
        /// <param name="index"></param>
        private static void computePath(int index)
        {
            //设置为1,标记当前点已经遍历
            visitPoints[index] = 1;
            if (isCurIndex(index))
            {
                int curDistanse;
                for (int i = 0; i < pointNum; i++)
                {
                    if (i != index && rectMatrix[index, i] != null)
                    {
                        curDistanse = distanse[index] == 0 ? 0 : (int)distanse[index];
                        if (curDistanse + rectMatrix[index, i] < distanse[i] || distanse[i] == 0)
                        {
                            distanse[i] = curDistanse + (int)rectMatrix[index, i];
                            if (index == startPoint)
                            {
                                path[i] = startPoint.ToString() + "=>" + i.ToString();
                            }
                            else
                            {
                                path[i] = path[index].ToString() + "=>" + i.ToString();
                                computePath(i);
                            }
                        }
                    }
                }
            }

            int visit = getVisitIndex();
            if (visit != -1)
            {
                computePath(visit);
            }
        }

        /// <summary>
        /// 得到未访问节点的最小索引
        /// </summary>
        /// <returns></returns>
        private static int getVisitIndex()
        {
            int index=-1;
            for(int i=0;i<pointNum;i++)
            {
                if (visitPoints[i] != 1)
                {
                    index = i;
                    break;
                }
            }
            return index;
        }

        /// <summary>
        /// 判断当前节点是否与上一节点相连
        /// </summary>
        /// <param name="index"></param>
        /// <returns></returns>
        private static bool isCurIndex(int index)
        {
            if (index == startPoint ||(path[index] != null 
                && path[index].IndexOf(index.ToString()) != -1))
            {
                return true;
            }
            return false;
        }
        /// <summary>
        /// 初始化邻接矩阵
        /// </summary>
        private static void initRectMatrix()
        {
            rectMatrix = new int?[pointNum, pointNum];

            rectMatrix[0, 1] = 15;
            rectMatrix[0, 2] = 20;
            rectMatrix[1, 3] = 30;
            rectMatrix[1, 2] = 30;
            rectMatrix[1, 4] = 20;
            rectMatrix[1, 5] = 30;
            rectMatrix[2, 3] = 30;
            rectMatrix[2, 4] = 20;
            rectMatrix[2, 6] = 30;
            rectMatrix[3, 5] = 30;
            rectMatrix[4, 7] = 20;
            rectMatrix[4, 8] = 30;
            rectMatrix[5, 6] = 30;
            rectMatrix[6, 9] = 20;
            rectMatrix[7, 8] = 30;
            rectMatrix[7, 9] = 30;
            rectMatrix[8, 4] = 20;
            rectMatrix[8, 0] = 30;
            rectMatrix[8, 3] = 30;
            rectMatrix[9, 2] = 20;
            rectMatrix[9, 7] = 30;
            rectMatrix[9, 6] = 30;

            for (int i = 0; i < pointNum; i++)
            {
                rectMatrix[i, i] = 0;
            }
        }
    }
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值