选择最佳线路(二)

如何要改进?

在上文中,讨论了最佳线路计算的数据结构的算法。但在交通线路的描述中,对网站线路孤立的起点,为了防止计算中无效循环,人为增加了下一结点为-1的虚拟点。但增加结点ID为-1的点,与现实不符。本文试图取消ID为-1的结点,并对算法进行修改。

修改后的深圳地铁的描述为

csharp 复制代码
string[] nsStr = [
     "1:1",
     "0:1>2:1>6:1>16:1",
     "1:4>3:6>7:3>15:1",
     "2:1>4:2>9:3>15:1",
     "3:2>15:1>10:3",
     "6:4",
     "1:6>5:3>7:5>11:1",
     "8:1>2:1>9:1",
     "7:1>9:1>12:1",
     "7:1>8:1>10:1>3:1" ,
     "4:1>9:1",
     "6:1>12:1",
     "8:1>11:1>13:1>14:1",
     "12:1",
     "12:1",
     "2:1>3:1>4:1>20:1>21:1",
     "1:1>18:1",
     "18:1",
     "16:1>17:1>19:1>20:1",
     "18:1>20:1",
     "18:1>19:1>15:1",
     "15:1"
     ];
      for (int i=0;i<nsStr.Length;i++)
   {
       ns = new NodeStation(i, nsStr[i]);
       lns.Add(ns); 
   }

算法修改为

csharp 复制代码
 public bool FindNodeWay(List<NodeStation> lns, List<NodeWay> listWay, int start, int end)
 {
     bool b = false, first, arrive = false;
     string s0, s1, s2;
     string[] sa, sb;
     int dist0 = 0, d1, nextStation;
     NodeStation ns;
     NodeWay nw, nw0;
     if (listWay.Count == 0)
     {
         ns = lns[start];
         sa = ns.Child.Split(">");
         for (int i = 0; i < sa.Length; i++)
         {
             sb = sa[i].Split(":");
             if (sb.Length > 1)
             {
                 nw = new NodeWay();
                 nw.Next = int.Parse(sb[0]);
                 nw.WayStr = $">{start}>{nw.Next}>";
                 nw.Distance = int.Parse(sb[1]);
                 listWay.Add(nw);
             }
         }
     }
   
     for (int i = 0; i < listWay.Count; i++)
     {              
         nw = listWay[i];
         s0 = nw.WayStr;
         dist0 = nw.Distance;
         first = true;
         if (!nw.Arrive)
         {
             ns = lns[nw.Next];
             sa = ns.Child.Split(">");
             for (int j = 0; j < sa.Length; j++)
             {
                 sb = sa[j].Split(":");
                 if (sb.Length > 1)
                 {
                     nextStation = int.Parse(sb[0]);
                     d1 = int.Parse(sb[1]);
                     s1 = $">{nextStation}>";
                     s2 = $"{nextStation}>";
                     if (!nw.WayStr.Contains(s1))
                     {
                         arrive = nextStation == end ? true : false;
                         if (first)
                         {
                             first = false;
                             nw.Arrive = arrive;
                             nw.Next = nextStation;
                             nw.Distance = dist0 + d1; ;
                             nw.WayStr = s0 + s2;
                         }
                         else
                         {
                             nw0 = new NodeWay();
                             nw0.WayStr = s0 + s2;
                             nw0.Next = nextStation;
                             nw0.Arrive = arrive;
                             nw0.Distance = dist0 + d1;
                             listWay.Add(nw0);
                         }
                     }
                 }
             }
             if (first)
             {
                 listWay.RemoveAt(i);
             }
             i = -1;
         }
     }
      return b;
 }

改进后的作用

按上述改进后,有两方面的提升

1.线路描述更加直观,简洁。

2.线路计算由于不再进行-1结点判断,效率提升。只要线路无新增结点,立即删除,减少剩余计算量。

相关推荐
-dzk-3 分钟前
【代码随想录】LC 59.螺旋矩阵 II
c++·线性代数·算法·矩阵·模拟
风筝在晴天搁浅13 分钟前
hot100 78.子集
java·算法
Jasmine_llq16 分钟前
《P4587 [FJOI2016] 神秘数》
算法·倍增思想·稀疏表(st 表)·前缀和数组(解决静态区间和查询·st表核心实现高效预处理和查询·预处理优化(提前计算所需信息·快速io提升大规模数据读写效率
超级大只老咪30 分钟前
快速进制转换
笔记·算法
m0_706653231 小时前
C++编译期数组操作
开发语言·c++·算法
故事和你911 小时前
sdut-Java面向对象-06 继承和多态、抽象类和接口(函数题:10-18题)
java·开发语言·算法·面向对象·基础语法·继承和多态·抽象类和接口
qq_423233901 小时前
C++与Python混合编程实战
开发语言·c++·算法
TracyCoder1231 小时前
LeetCode Hot100(19/100)——206. 反转链表
算法·leetcode
m0_715575341 小时前
分布式任务调度系统
开发语言·c++·算法