/// <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")); } } }
/// <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); }