」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 加權圖類

加權圖類

發佈於2024-11-07
瀏覽:712

The WeightedGraph class extends AbstractGraph.
The preceding chapter designed the Graph interface, the AbstractGraph class, and the UnweightedGraph class for modeling graphs. Following this pattern, we design WeightedGraph as a subclass of AbstractGraph, as shown in Figure below.

The WeightedGraph Class

WeightedGraph simply extends AbstractGraph with five constructors for creating concrete WeightedGraph instances. WeightedGraph inherits all methods from AbstractGraph, overrides the clear and addVertex methods, implements a new addEdge method for adding a weighted edge, and also introduces new methods for obtaining minimum spanning trees and for finding all single-source shortest paths. Minimum spanning trees and shortest paths will be introduced in Sections Minimum spanning trees and shortest paths, respectively.

The code below implements WeightedGraph. Edge adjacency lists (lines 38–63) are used internally to store adjacent edges for a vertex. When a WeightedGraph is constructed, its edge adjacency lists are created (lines 47 and 57). The methods getMinimumSpanningTree() (lines 99–138) and getShortestPath() (lines 156–197) will be introduced in upcoming sections.

package demo;
import java.util.*;

public class WeightedGraph extends AbstractGraph {
    /** Construct an empty */
    public WeightedGraph() {}

    /** Construct a WeightedGraph from vertices and edged in arrays */
    public WeightedGraph(V[] vertices, int[][] edges) {
        createWeightedGraph(java.util.Arrays.asList(vertices), edges);
    }

     /** Construct a WeightedGraph from vertices and edges in list */
    public WeightedGraph(int[][] edges, int numberOfVertices) {
        List vertices = new ArrayList();
        for (int i = 0; i  vertices, List edges) {
        createWeightedGraph(vertices, edges);
    }

    /** Construct a WeightedGraph from vertices 0, 1, and edge array */
    public WeightedGraph(List edges, int numberOfVertices) {
        List vertices = new ArrayList();
        for (int i = 0; i  vertices, int[][] edges) {
        this.vertices = vertices;

        for (int i = 0; i ()); // Create a list for vertices
        }

        for (int i = 0; i  vertices, List edges) {
        this.vertices = vertices;

        for (int i = 0; i ()); // Create a list for vertices
        }

        for (WeightedEdge edge: edges) {
            neighbors.get(edge.u).add(edge); // Add an edge into the list
        }
    }

    /** Return the weight on the edge (u, v) */
    public double getWeight(int u, int v) throws Exception {
        for (Edge edge : neighbors.get(u)) {
            if (edge.v == v) {
                return ((WeightedEdge)edge).weight;
            }
        }

        throw new Exception("Edge does not exit");
    }

    /** Display edges with weights */
    public void printWeightedEdges() {
        for (int i = 0; i  T = new ArrayList();

        // Expand T
        while (T.size()  ((WeightedEdge)e).weight) {
                    cost[e.v] = ((WeightedEdge)e).weight;
                    parent[e.v] = u;
                }
            }
        } // End of while

        return new MST(startingVertex, parent, T, totalWeight);
    }

    /** MST is an inner class in WeightedGraph */
    public class MST extends Tree {
        private double totalWeight; // Total weight of all edges in the tree

        public MST(int root, int[] parent, List searchOrder, double totalWeight) {
            super(root, parent, searchOrder);
            this.totalWeight = totalWeight;
        }

        public double getTotalWeight() {
            return totalWeight;
        }
    }

    /** Find single source shortest paths */
    public ShortestPathTree getShortestPath(int sourceVertex) {
        // cost[v] stores the cost of the path from v to the source
        double[] cost = new double[getSize()];
        for (int i = 0; i  T = new ArrayList();

        // Expand T
        while (T.size()  cost[u]   ((WeightedEdge)e).weight) {
                    cost[e.v] = cost[u]   ((WeightedEdge)e).weight;
                    parent[e.v] = u;
                }
            }
        } // End of while

        // Create a ShortestPathTree
        return new ShortestPathTree(sourceVertex, parent, T, cost);
    }

    /** ShortestPathTree is an inner class in WeightedGraph */
    public class ShortestPathTree extends Tree {
        private double[] cost; // cost[v] is the cost from v to source

        /** Construct a path */
        public ShortestPathTree(int source, int[] parent, List searchOrder, double[] cost) {
            super(source, parent, searchOrder);
            this.cost = cost;
        }

        /** Return the cost for a path from the root to vertex v */
        public double getCost(int v) {
            return cost[v];
        }

        /** Print paths from all vertices to the source */
        public void printAllPaths() {
            System.out.println("All shortest paths from "   vertices.get(getRoot())   " are:");
            for (int i = 0; i 



The WeightedGraph class extends the AbstractGraph class (line 3). The properties vertices and neighbors in AbstractGraph are inherited in WeightedGraph.neighbors is a list. Each element is the list is another list that contains edges. For unweighted graph, each edge is an instance of AbstractGraph.Edge. For a weighted graph, each edge is an instance of WeightedEdge. WeightedEdge is a subtype of Edge. So you can add a weighted edge into neighbors.get(i) for a weighted graph (line 47).

The code below gives a test program that creates a graph for the one in Figure below and another graph for the one in Figure below a.

The WeightedGraph Class

The WeightedGraph Class

package demo;

public class TestWeightedGraph {

    public static void main(String[] args) {
        String[] vertices = {"Seattle", "San Francisco", "Los Angeles", "Denver", "Kansas City", "Chicago", "Boston", "New York", "Atlanta", "Miami", "Dallas", "Houston"};

        int[][] edges = {
                {0, 1, 807}, {0, 3, 1331}, {0, 5, 2097},
                {1, 0, 807}, {1, 2, 381}, {1, 3, 1267},
                {2, 1, 381}, {2, 3, 1015}, {2, 4, 1663}, {2, 10, 1435},
                {3, 0, 1331}, {3, 1, 1267}, {3, 2, 1015}, {3, 4, 599}, {3, 5, 1003},
                {4, 2, 1663}, {4, 3, 599}, {4, 5, 533}, {4, 7, 1260}, {4, 8, 864}, {4, 10, 496},
                {5, 0, 2097}, {5, 3, 1003}, {5, 4, 533}, {5, 6, 983}, {5, 7, 787},
                {6, 5, 983}, {6, 7, 214},
                {7, 4, 1260}, {7, 5, 787}, {7, 6, 214}, {7, 8, 888},
                {8, 4, 864}, {8, 7, 888}, {8, 9, 661}, {8, 10, 781}, {8, 11, 810},
                {9, 8, 661}, {9, 11, 1187},
                {10, 2, 1435}, {10, 4, 496}, {10, 8, 781}, {10, 11, 239},
                {11, 8, 810}, {11, 9, 1187}, {11, 10, 239}
        };

        WeightedGraph graph1 = new WeightedGraph(vertices, edges);
        System.out.println("The number of vertices in graph1: "   graph1.getSize());
        System.out.println("The vertex with index 1 is "   graph1.getVertex(1));
        System.out.println("The index for Miami is "   graph1.getIndex("Miami"));
        System.out.println("The edges for graph1:");
        graph1.printWeightedEdges();

        edges = new int[][] {
            {0, 1, 2}, {0, 3, 8},
            {1, 0, 2}, {1, 2, 7}, {1, 3, 3},
            {2, 1, 7}, {2, 3, 4}, {2, 4, 5},
            {3, 0, 8}, {3, 1, 3}, {3, 2, 4}, {3, 4, 6},
            {4, 2, 5}, {4, 3, 6}
        };
        WeightedGraph graph2 = new WeightedGraph(edges, 5);
        System.out.println("\nThe edges for graph2:");
        graph2.printWeightedEdges();
    }
}

The number of vertices in graph1: 12
The vertex with index 1 is San Francisco
The index for Miami is 9
The edges for graph1:
Vertex 0: (0, 1, 807) (0, 3, 1331) (0, 5, 2097)
Vertex 1: (1, 2, 381) (1, 0, 807) (1, 3, 1267)
Vertex 2: (2, 1, 381) (2, 3, 1015) (2, 4, 1663) (2, 10, 1435)
Vertex 3: (3, 4, 599) (3, 5, 1003) (3, 1, 1267)
(3, 0, 1331) (3, 2, 1015)
Vertex 4: (4, 10, 496) (4, 8, 864) (4, 5, 533) (4, 2, 1663)
(4, 7, 1260) (4, 3, 599)
Vertex 5: (5, 4, 533) (5, 7, 787) (5, 3, 1003)
(5, 0, 2097) (5, 6, 983)
Vertex 6: (6, 7, 214) (6, 5, 983)
Vertex 7: (7, 6, 214) (7, 8, 888) (7, 5, 787) (7, 4, 1260)
Vertex 8: (8, 9, 661) (8, 10, 781) (8, 4, 864)
(8, 7, 888) (8, 11, 810)
Vertex 9: (9, 8, 661) (9, 11, 1187)
Vertex 10: (10, 11, 239) (10, 4, 496) (10, 8, 781) (10, 2, 1435)
Vertex 11: (11, 10, 239) (11, 9, 1187) (11, 8, 810)

The edges for graph2:
Vertex 0: (0, 1, 2) (0, 3, 8)
Vertex 1: (1, 0, 2) (1, 2, 7) (1, 3, 3)
Vertex 2: (2, 3, 4) (2, 1, 7) (2, 4, 5)
Vertex 3: (3, 1, 3) (3, 4, 6) (3, 2, 4) (3, 0, 8)
Vertex 4: (4, 2, 5) (4, 3, 6)

The program creates graph1 for the graph in Figure above in lines 3–27. The vertices for graph1 are defined in lines 3–5. The edges for graph1 are defined in lines 7–24. The edges are represented using a two-dimensional array. For each row i in the array, edges[i][0] and edges[i][1] indicate that there is an edge from vertex edges[i][0] to vertex edges[i][1] and the weight for the edge is edges[i][2]. For example, {0, 1, 807} (line 8) represents the edge from vertex 0 (edges[0][0]) to vertex 1 (edges[0][1]) with weight 807 (edges[0][2]). {0, 5, 2097} (line 8) represents the edge from vertex 0 (edges[2][0]) to vertex 5 (edges[2][1]) with weight 2097 (edges[2][2]). Line 35 invokes the printWeightedEdges() method on graph1 to display all edges in graph1.

The program creates the edges for graph2 for the graph in Figure above a in lines 37–44. Line 46 invokes the printWeightedEdges() method on graph2 to display all edges in graph2.

版本聲明 本文轉載於:https://dev.to/paulike/the-weightedgraph-class-451m?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • 如何使用 Connector .NET 檢索 MySQL 中的最後一個插入 ID?
    如何使用 Connector .NET 檢索 MySQL 中的最後一個插入 ID?
    使用Connector .NET 在MySql 中檢索最後一個插入ID在MySql 中,最後一個插入ID 是指分配給新插入的標識符排。該值在某些情況下可能很有價值,例如填充外鍵關係。 最初,假設 MySqlHelper 類別的 ExecuteNonQuery 方法傳回最後一個插入 ID。然而,這個假...
    程式設計 發佈於2024-11-08
  • 如何在 PHP 中使用 cURL 取得 API 回應?
    如何在 PHP 中使用 cURL 取得 API 回應?
    在PHP 中使用cURL 取得API 回應在PHP 中,您可以建立一個獨立的類,其中包含透過cURL 呼叫API的函數並獲得響應。以下是實現此目的的方法:class ApiRequest { public function getResponse($url) { // Set cURL ...
    程式設計 發佈於2024-11-08
  • Ansible 入門 - 初學者指南:日復一日的 DevOps 工具系列
    Ansible 入門 - 初學者指南:日復一日的 DevOps 工具系列
    欢迎来到我们的“50 天 50 个 DevOps 工具”系列的第 30 天!今天,我们将探索 Ansible,它是 DevOps 工具包中最重要的工具之一。本博客将向您介绍 Ansible 的基础知识,分解其关键组件并向您展示如何从简单的示例开始。我们会让事情简单明了,使其成为初学者的完美起点。 ...
    程式設計 發佈於2024-11-08
  • 什麼是CPU暫存器
    什麼是CPU暫存器
    什麼是暫存器: 電腦暫存器是電腦中央處理單元 (CPU) 內的小型高速儲存單元,用於暫時保存資料和指令,以便在處理過程中快速存取。它們是直接影響 CPU 運算速度和效率的重要元件。 暫存器的存取速度比記憶體更快,因為它們位於 CPU 內部。這種接近性允許更快的資料檢索和處理。 暫存器記憶體是電腦...
    程式設計 發佈於2024-11-08
  • 折疊還是雙折?這是一個技術問題!
    折疊還是雙折?這是一個技術問題!
    我們現在不能停下來,因為我們已經投資了 1 倍,但多年來讓我們繼續投入 100 倍!斯托克斯! JavaScript 範例 你可能以前聽說過,但 Javascript 是在 10 天內寫成的。它的採用率迅速增長,即使在使用該語言幾年後,他們也不想引入重大變化……所以,現在該語言已經...
    程式設計 發佈於2024-11-08
  • 動態 Getter 和 Setter 如何增強 JavaScript 的靈活性?
    動態 Getter 和 Setter 如何增強 JavaScript 的靈活性?
    在 JavaScript 中實作動態 Getter 和 Setter:指南在傳統 JavaScript 中,getter 和 setter 是為特定屬性名稱定義的。但是,可以使用 ES2015 中引入的代理程式建立更靈活的動態 getter 和 setter。 使用代理的動態 getter 和 se...
    程式設計 發佈於2024-11-08
  • 如何在 Go 中將類型變數傳遞給函數進行類型斷言?
    如何在 Go 中將類型變數傳遞給函數進行類型斷言?
    將類型變數傳遞給函數進行型別斷言您希望透過將型別傳遞給函式來執行型別斷言。本質上,您的目標是實現以下目標:// Note that this is pseudocode, because Type isn't valid here func myfunction(mystring string, m...
    程式設計 發佈於2024-11-08
  • 從輸入欄位取得文字..
    從輸入欄位取得文字..
    Java代碼 public class MainActivity extends AppCompatActivity { Button btn; TextView textView; @Override protected void onCreate(Bundle s...
    程式設計 發佈於2024-11-08
  • PSD 批次編輯器
    PSD 批次編輯器
    大家好!我正在分享我在過去幾個月開發的這個新軟體。 我希望它可以幫助一些人,有些人可能有興趣幫助我改進它。我想添加很多功能,所以請隨時告訴我您希望在軟體中看到什麼。 在技術方面,我開始這個專案是為了嘗試在我的程式碼中實現一些設計模式,並更好地建立架構。這也是我第一次使用QT(我在過去的GUI專案...
    程式設計 發佈於2024-11-08
  • 為什麼 WinAPI Sleep(1) 會導致 15 毫秒暫停?
    為什麼 WinAPI Sleep(1) 會導致 15 毫秒暫停?
    了解WinAPI Sleep() 函數持續時間的差異當以1 毫秒為參數呼叫WinAPI Sleep() 函數時,據觀察,執行緒實際上暫停的時間要長得多,通常約為15 毫秒。這種現象引起了人們對潛在系統問題的擔憂。 Windows 中的時間量化Windows 採用時間量化機制進行執行緒調度。這意味著系...
    程式設計 發佈於2024-11-08
  • 以下是一些符合條件的標題選項: 

* JavaScript 中的相對路徑與絕對路徑:何時使用哪一個?
* JavaScript 路徑:絕對路徑還是相對路徑?性能和安全指南。
* 瓦時
    以下是一些符合條件的標題選項: * JavaScript 中的相對路徑與絕對路徑:何時使用哪一個? * JavaScript 路徑:絕對路徑還是相對路徑?性能和安全指南。 * 瓦時
    澄清 JavaScript 中的相對路徑和絕對路徑相對路徑和絕對路徑是 Web 開發中的基本概念,理解它們的差異至關重要。 定義絕對路徑指定相對於根目錄的位置(例如,/images/kitten.png)。另一方面,相對路徑指定相對於目前工作目錄的位置(例如,kitten.png)。 效能注意事項相...
    程式設計 發佈於2024-11-08
  • 如何處理 MySQL 查詢中的外鍵插入:兩種常見場景
    如何處理 MySQL 查詢中的外鍵插入:兩種常見場景
    如何處理MySQL 查詢中的外鍵插入為了有效地將值插入到具有外鍵的表中,讓我們探討兩個常見的場景:場景1:新增學生和現有教師要將新學生連結到現有教師,請使用教師姓名檢索外鍵:INSERT INTO TAB_STUDENT(name_student, id_teacher_fk) SELECT 'Jo...
    程式設計 發佈於2024-11-08
  • std::lock_guard 與 std::scoped_lock:何時選擇哪一個?
    std::lock_guard 與 std::scoped_lock:何時選擇哪一個?
    考慮std::lock_guard 與std::scoped_lockC 17 標誌著引入了一個新穎的鎖類std::scoped_lock ,它與古老的std::lock_guard 有相似之處。本文深入探討了這兩種鎖定機制之間的區別,引導您選擇適合您特定需求的最佳工具。 何時使用std::lock...
    程式設計 發佈於2024-11-08
  • 如何使用 Java 和 Apache Tika 從 Zip 檔案中的檔案中提取內容?
    如何使用 Java 和 Apache Tika 從 Zip 檔案中的檔案中提取內容?
    如何使用Java 和Apache Tika 從Zip 檔案中的檔案讀取和提取內容實作從Zip 檔案中讀取和提取內容的任務使用Java 和Apache Tika 壓縮zip 檔案中的檔案涉及幾個關鍵步驟。 1。初始化輸入首先從要處理的檔案建立輸入流:InputStream input = new Fi...
    程式設計 發佈於2024-11-08
  • 當公式存在時,如何使用 Openpyxl 從 Excel 電子表格中檢索實際儲存格值?
    當公式存在時,如何使用 Openpyxl 從 Excel 電子表格中檢索實際儲存格值?
    如何使用 Openpyxl 忽略公式並檢索實際單元格值使用包含公式的 Excel 電子表格時,檢索基礎單元格值可能具有挑戰性。 Openpyxl 是一個用於讀寫 Excel 檔案的熱門 Python 函式庫,可讓您存取儲存格值而無需計算公式結果。 問題:公式而不是實際值使用 Openpyxl 時的一...
    程式設計 發佈於2024-11-08

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3