存储图(邻接矩阵)

要存储图形,有两种常见方法:

  • 邻接矩阵
  • 邻接名单

邻接矩阵是用于表示一个有限图的正方形矩阵。矩阵的元素指示图中的顶点对是否相邻。

相邻意味着’毗邻或毗邻其他东西’或旁边的东西。例如,你的邻居与你相邻。在图论中,如果我们可以从节点 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