示例#1
0
        /// <summary>
        /// 读取最短路径
        /// </summary>
        /// <param name="path">路径</param>
        /// <param name="start">开始</param>
        /// <param name="end">结束</param>
        public void GetShortest(ref List <T> path, T start, T end)
        {
            if (end == null)
            {
                return;
            }
            WeightedGraphNode <T>  nodeEnd  = NodeList.FirstOrDefault(s => s.Data.CompareTo(end) == 0);
            Dictionary <T, double> children = nodeEnd.Children;

            path.Add(end);
            if (children != null)
            {
                var minData = default(T);
                foreach (var itemC in children)
                {
                    WeightedGraphNode <T> nodeC = NodeList.FirstOrDefault(s => s.Data.CompareTo(itemC.Key) == 0);

                    if ((nodeEnd.Weight - itemC.Value).CompareTo(nodeC.Weight) == 0)
                    {
                        minData = nodeC.Data;
                        break;
                    }
                }
                GetShortest(ref path, start, minData);
            }
        }
示例#2
0
        /// <summary>
        /// 狄克斯特拉算法
        /// 如果图中含有负数权重,狄克斯特拉算法可能会无法得出正确答案
        /// </summary>
        public void Dijkstra(T current, T end)
        {
            if (NodeList == null)
            {
                //图为空
                return;
            }
            if (current.CompareTo(end) == 0)
            {
                return;
            }
            WeightedGraphNode <T> nodeCurrent = NodeList.FirstOrDefault(s => s.Data.CompareTo(current) == 0);

            if (nodeCurrent == null)
            {
                return;
            }
            nodeCurrent.Visited = true;
            Dictionary <T, double> children = nodeCurrent.Children;

            if (children != null)
            {
                foreach (var itemC in children)
                {
                    WeightedGraphNode <T> nodeChildren = NodeList.FirstOrDefault(s => s.Data.CompareTo(itemC.Key) == 0);
                    if (nodeChildren.Visited)
                    {
                        continue;
                    }
                    var currentWeight = nodeCurrent.Weight + itemC.Value;
                    if (currentWeight.CompareTo(nodeChildren.Weight) < 0)
                    {
                        nodeChildren.Weight = currentWeight;
                    }
                    BackupList.Add(nodeChildren);
                }
            }
            var minData = default(T);

            if (BackupList.Count > 0)
            {
                double weight = double.MaxValue;
                foreach (var backup in BackupList)
                {
                    if (backup.Weight < weight)
                    {
                        weight  = backup.Weight;
                        minData = backup.Data;
                    }
                }
            }
            WeightedGraphNode <T> nodeMin = NodeList.FirstOrDefault(s => s.Data.CompareTo(minData) == 0);

            BackupList.Remove(nodeMin);
            Dijkstra(minData, end);
        }
示例#3
0
 /// <summary>
 /// 贝尔曼-福特算法
 /// </summary>
 public void BellmanFord()
 {
     if (NodeList == null)
     {
         //图为空
         return;
     }
     UpdateNum++;
     if (UpdateNum >= NodeList.Count)
     {
         //该图有负权回路
         return;
     }
     foreach (var node in NodeList)
     {
         if (!IsWeightChange)
         {
             return;
         }
         Dictionary <T, double> children = node.Children;
         if (children != null)
         {
             foreach (var itemC in children)
             {
                 WeightedGraphNode <T> nodeChildren = NodeList.FirstOrDefault(s => s.Data.CompareTo(itemC.Key) == 0);
                 var currentWeight = node.Weight + itemC.Value;
                 if (currentWeight.CompareTo(nodeChildren.Weight) < 0)
                 {
                     nodeChildren.Weight = currentWeight;
                     IsWeightChange      = true;
                 }
                 else
                 {
                     IsWeightChange = false;
                 }
             }
         }
     }
     BellmanFord();
 }