📜  如何在Java使用事件矩阵表示图形?

📅  最后修改于: 2021-09-07 04:43:26             🧑  作者: Mango

关联矩阵只是一个包含有关任何两个类的对象(或实例)之间关系的信息的矩阵。矩阵的行代表一类对象,而列代表另一类。矩阵中的任何坐标(x, y)表示第一类的第x元素和第二类的第y元素之间的关系。

例如,假设关联矩阵 A 表示汽车和制造商之间的关系。如果我们让行代表的汽车和列代表厂商,任何坐标(X,Y)的矩阵将会给我们的信息是否X车由y制造商制造。

图表和发生率矩阵

关联矩阵是大小为n x m的矩阵(比如A ),其中n是顶点数, m是图中的边数。矩阵中的任何元素A i,j表示有关顶点i和边j之间关系的信息。根据所表示的图形和关系的类型,该值可能会有所不同。

让我们看一下将无向图表示为关联矩阵。输入表示将是一个邻接矩阵,但您可以使用简单的逻辑将其调整为任何其他表示。

用Java从邻接矩阵中获取发生率矩阵

您在大多数地方遇到的最常见的图形表示是邻接矩阵的表示。因此,这里我们展示如何从邻接矩阵获得关联矩阵,其中A i,j表示连接顶点ij的边数

我们将遵循的将邻接矩阵转换为关联矩阵的方法是:

  1. 通过计算邻接矩阵中非零值的数量来计算图中的边数。对于无向图,这可以在O(n(n-1)/2) 中完成
  2. 创建一个大小为顶点 x 边的关联矩阵,其中每列将代表一条边在穿过该列的所有行上的关联。
  3. 与步入步骤 1 类似,我们再次遍历邻接矩阵以找出由各个边连接的顶点。对于在邻接矩阵中找到的每条边,我们在关联矩阵中将其入射顶点标记为1

例如,让我们用关联矩阵表示以下图形:

具有 4 个顶点和 4 个边的简单图

Java
// Java program to convert adjacency matrix
// to incidence matrix
  
import java.io.*;
  
class GFG {
    public int[][] adjacencyMatToIncidenceMat(int[][] adj)
    {
        int vertices = adj.length, edges = 0;
  
        // count number of edges in the graph
        for (int i = 0; i < adj.length; i++) {
            for (int j = i + 1; j < adj[i].length; j++) {
                if (adj[i][j] > 0)
                    edges++;
            }
        }
  
        // construct incidence matrix
        int[][] incidenceMat = new int[adj.length][edges];
        for (int i = 0; i < adj.length; i++) {
            
            for (int j = i + 1; j < adj[i].length; j++) {
                int edgeNumber = adj[i][j];
  
                if (edgeNumber > 0) {
                    incidenceMat[i][edgeNumber - 1] = 1;
                    incidenceMat[j][edgeNumber - 1] = 1;
                }
            }
            
        }
  
        return incidenceMat;
    }
  
    // driver code
    public static void main(String[] args)
    {
        GFG gfg = new GFG();
        int[][] adj = {
            { 0, 1, 0, 4 },
            { 1, 0, 2, 0 },
            { 0, 2, 0, 3 },
            { 4, 0, 3, 0 },
        };
        int[][] incidence = gfg.adjacencyMatToIncidenceMat(adj);
  
        for (int[] row : incidence) {
            for (int val : row) {
                System.out.print(val);
            }
            System.out.println();
        }
    }
}


输出
1001
1100
0110
0011

时间复杂度 O(n(n-1)) 其中 n 是顶点数。

如果您想与行业专家一起参加直播课程,请参阅Geeks Classes Live