儲存圖(鄰接矩陣)

要儲存圖形,有兩種常見方法:

  • 鄰接矩陣
  • 鄰接名單

鄰接矩陣是用於表示一個有限圖的正方形矩陣。矩陣的元素指示圖中的頂點對是否相鄰。

相鄰意味著’毗鄰或毗鄰其他東西’或旁邊的東西。例如,你的鄰居與你相鄰。在圖論中,如果我們可以從節點 A 轉到節點 B ,我們可以說節點 B節點 A 相鄰。現在我們將瞭解如何通過 Adjacency Matrix 儲存哪個節點與哪個節點相鄰。這意味著,我們將表示哪些節點在它們之間共享邊緣。這裡矩陣表示 2D 陣列。 **** **** ****

https://i.stack.imgur.com/Oh7b1.jpg

在這裡你可以看到圖表旁邊的表格,這是我們的鄰接矩陣。這裡 Matrix [i] [j] = 1 表示在 ij 之間存在邊緣。如果沒有邊緣,我們只需將 Matrix [i] [j] = 0

這些邊可以加權,就像它可以代表兩個城市之間的距離。然後我們將值放在 **Matrix [i] [j]中,**而不是放 1。

上面描述的圖是雙向的或無向的,這意味著,如果我們可以從節點 2 轉到節點 1 ,我們也可以從節點 1 轉到節點 2 。如果圖表是定向的,那麼圖表的一側會有箭頭符號。即便如此,我們也可以使用鄰接矩陣來表示它。 **** **** **** **

https://i.stack.imgur.com/MBM3s.jpg

我們表示不通過無窮大共享邊緣的節點。需要注意的一點是,如果圖是無向的,則矩陣變得對稱

用於建立矩陣的虛擬碼:

Procedure AdjacencyMatrix(N):    //N represents the number of nodes
Matrix[N][N]
for i from 1 to N
    for j from 1 to N
        Take input -> Matrix[i][j]
    endfor
endfor

我們也可以使用這種常見方式填充 Matrix:

Procedure AdjacencyMatrix(N, E):    // N -> number of nodes
Matrix[N][E]                        // E -> number of edges
for i from 1 to E
    input -> n1, n2, cost
    Matrix[n1][n2] = cost
    Matrix[n2][n1] = cost
endfor

對於有向圖,我們可以刪除 Matrix [n2] [n1] =成本線。

使用 Adjacency Matrix 的缺點:

記憶是一個巨大的問題。無論有多少邊,我們總是需要 N * N 大小的矩陣,其中 N 是節點的數量。如果有 10000 個節點,則矩陣大小將為 4 * 10000 * 10000,大約為 381 兆位元組。如果我們考慮具有一些邊緣的圖形,則這是對記憶體的巨大浪費。

假設我們想知道我們可以從節點 u 到哪個節點。我們將需要檢查的整排 U ,花費了大量的時間。

唯一的好處是,我們可以使用 Adjacency Matrix 輕鬆找到 uv 節點之間的連線及其成本。

使用上面的虛擬碼實現的 Java 程式碼:

import java.util.Scanner;
 
public class Represent_Graph_Adjacency_Matrix 
{
    private final int vertices;
    private int[][] adjacency_matrix;
 
    public Represent_Graph_Adjacency_Matrix(int v) 
    {
        vertices = v;
        adjacency_matrix = new int[vertices + 1][vertices + 1];
    }
 
    public void makeEdge(int to, int from, int edge) 
    {
        try 
        {
            adjacency_matrix[to][from] = edge;
        }
        catch (ArrayIndexOutOfBoundsException index) 
        {
            System.out.println("The vertices does not exists");
        }
    }
 
    public int getEdge(int to, int from) 
    {
        try 
        {
            return adjacency_matrix[to][from];
        }
        catch (ArrayIndexOutOfBoundsException index) 
        {
            System.out.println("The vertices does not exists");
        }
        return -1;
    }
 
    public static void main(String args[]) 
    {
        int v, e, count = 1, to = 0, from = 0;
        Scanner sc = new Scanner(System.in);
        Represent_Graph_Adjacency_Matrix graph;
        try 
        {
            System.out.println("Enter the number of vertices: ");
            v = sc.nextInt();
            System.out.println("Enter the number of edges: ");
            e = sc.nextInt();
 
            graph = new Represent_Graph_Adjacency_Matrix(v);
 
            System.out.println("Enter the edges: <to> <from>");
            while (count <= e) 
            {
                to = sc.nextInt();
                from = sc.nextInt();
 
                graph.makeEdge(to, from, 1);
                count++;
            }
 
            System.out.println("The adjacency matrix for the given graph is: ");
            System.out.print("  ");
            for (int i = 1; i <= v; i++)
                System.out.print(i + " ");
            System.out.println();
 
            for (int i = 1; i <= v; i++) 
            {
                System.out.print(i + " ");
                for (int j = 1; j <= v; j++) 
                    System.out.print(graph.getEdge(i, j) + " ");
                System.out.println();
            }
 
        }
        catch (Exception E) 
        {
            System.out.println("Somthing went wrong");
        }
 
        sc.close();
    }
}

執行程式碼:儲存檔案並使用 javac Represent_Graph_Adjacency_Matrix.java 進行編譯

例:

$ java Represent_Graph_Adjacency_Matrix
Enter the number of vertices:
4
Enter the number of edges:
6
Enter the edges: <to> <from>
1 1
3 4
2 3
1 4
2 4
1 2
The adjacency matrix for the given graph is:
  1 2 3 4
1 1 1 0 1
2 0 0 1 1
3 0 0 0 1
4 0 0 0 0