/// <summary>
        /// 向加权有向图中添加一条边e
        /// </summary>
        /// <param name="e"></param>
        public void addEdge(EdgeDirected e)
        {
            // 边e是有方向的,所以只需要让e出现在起点的邻接表中即可
            int v = e.from();

            this.adjQueue[v].enqueue(e);
            this.E++;
        }
        /// <summary>
        /// 最短路径
        /// </summary>
        private static void DijksraSPTest()
        {
            // 创建加权有向图
            EdgeDirectedWeightedDirgraph graph = new EdgeDirectedWeightedDirgraph(8);

            graph.addEdge(new EdgeDirected(4, 5, 0.35f));
            graph.addEdge(new EdgeDirected(5, 4, 0.35f));
            graph.addEdge(new EdgeDirected(4, 7, 0.37f));
            graph.addEdge(new EdgeDirected(5, 7, 0.28f));
            graph.addEdge(new EdgeDirected(7, 5, 0.28f));
            graph.addEdge(new EdgeDirected(5, 1, 0.32f));
            graph.addEdge(new EdgeDirected(0, 4, 0.38f));
            graph.addEdge(new EdgeDirected(0, 2, 0.26f));
            graph.addEdge(new EdgeDirected(7, 3, 0.39f));
            graph.addEdge(new EdgeDirected(1, 3, 0.29f));
            graph.addEdge(new EdgeDirected(2, 7, 0.34f));
            graph.addEdge(new EdgeDirected(6, 2, 0.40f));
            graph.addEdge(new EdgeDirected(3, 6, 0.52f));
            graph.addEdge(new EdgeDirected(6, 0, 0.58f));
            graph.addEdge(new EdgeDirected(6, 4, 0.93f));
            // 创建 DijksraSP 对象 查找最短路径
            int       start   = 0;
            DijksraSP dijksra = new DijksraSP(graph, start);
            // 查找最短路径  0->6
            int end = 6;
            QueueList <EdgeDirected> allEdges = dijksra.pathTo(end);

            // 遍历打印
            if (allEdges == null)
            {
                Console.WriteLine("not path to " + end);
            }
            else
            {
                IEnumerator ie = allEdges.GetEnumerator();
                while (ie.MoveNext())
                {
                    EdgeDirected e = (EdgeDirected)ie.Current;
                    Console.WriteLine(e.from() + " -> " + e.to() + " : " + e.weight().ToString("F2"));
                }
            }
        }
Exemplo n.º 3
0
        /// <summary>
        /// 查询从起点s到顶点v的最短路径中所有的边
        /// </summary>
        /// <param name="v"></param>
        /// <returns></returns>
        public QueueList <EdgeDirected> pathTo(int v)
        {
            // 判断从顶点 s 到顶点v是否可达
            if (!this.hasPathTo(v))
            {
                return(null);
            }
            // 创建队列对象
            QueueList <EdgeDirected> allEdges = new QueueList <EdgeDirected>();

            while (true)
            {
                EdgeDirected e = this.edgeTo[v];
                if (e == null)
                {
                    break;
                }

                allEdges.enqueue(e);
                v = e.from();
            }
            return(allEdges);
        }