.Net 版本 Dijkstra

来源:互联网 发布:ubuntu新建文件 编辑:程序博客网 时间:2024/06/07 05:08
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;

namespace ConsoleApplication
{
    class Dijkstra
    {
        private List<Model> list = new List<Model>();

        public List<Model> Shorpath(DataTable dt)
        {
            DataRow[] drArr;
            string strNode;
            string strNodeNext;
            int iNodePoint;
            Model model;
            //判断符合增加到列表的条件
            bool blinfo;
            drArr = dt.Select("node='0'");
            foreach (DataRow dr in drArr)
            {
                blinfo = false;
                strNode = dr[0].ToString();
                strNodeNext = dr[1].ToString();
                iNodePoint = Int32.Parse(dr[2].ToString());
                model=new Model();
                model.setNode(strNode);
                model.setNodeNext(strNodeNext);
                model.setNodePoint(iNodePoint);
                model.setNodeInfo(strNode+"->"+strNodeNext);
                model.setNodeSum(iNodePoint);
                //得到子节点所有最短路径
                for (int i = 0; i < list.Count; i++)
                {
                    if (list[i].getNodeNext().Equals(model.getNodeNext()) == true)
                    {
                        blinfo = true;
                        if (list[i].getNodeSum() > model.getNodeSum())
                        {
                            list[i] = model;
                        }
                        else
                        {
                            //最短路径相同时添加路径
                            if (list[i].getNodeSum() == model.getNodeSum())
                            {
                                blinfo = false;
                            }
                        }
                        break;
                    }
                }
                if (blinfo == false)
                {
                    list.Add(model);
                }
                CalculatePath(model,dt);
            }
            return list;
        }

        //计算下一节点的最短路径,并更新结果集
        public void CalculatePath(Model model, DataTable dt)
        {
            string strNode;
            string strNodeNext;
            int iNodePoint;
            Model modelNew = null;
            DataRow[] drArr;
            bool blinfo;
            drArr = dt.Select("node='" + model.getNodeNext() + "'");
            if (drArr.Length != 0)
            {
                //得到子节点所有最短路径
                foreach (DataRow dr in drArr)
                {
                    blinfo = false;
                    strNode = dr[0].ToString();
                    strNodeNext = dr[1].ToString();
                    iNodePoint = Int32.Parse(dr[2].ToString());
                    modelNew = new Model();
                    modelNew.setNode(strNode);
                    modelNew.setNodeNext(strNodeNext);
                    modelNew.setNodePoint(iNodePoint);
                    modelNew.setNodeInfo(model.getNodeInfo() + "->" + strNodeNext);
                    modelNew.setNodeSum(model.getNodeSum()+iNodePoint);
                    //添加子节点时对已有节点判断是否重复
                    for (int i = 0; i < list.Count; i++)
                    {
                        if (list[i].getNodeNext().Equals(modelNew.getNodeNext())==true)
                        {
                            blinfo = true;
                            if (list[i].getNodeSum() > modelNew.getNodeSum())
                            {
                                list[i] = modelNew;
                            }
                            else
                            {
                                //最短路径相同时添加路径
                                if (list[i].getNodeSum() == modelNew.getNodeSum())
                                {
                                    blinfo = false;
                                }
                            }
                            break;
                        }
                    }
                    if (blinfo == false)
                    {
                        list.Add(modelNew);
                    }
                    CalculatePath(modelNew, dt);
                }
                
            }
        }

    }
}

Dijkstra



注明 转载


原创粉丝点击