📜  实现给定图的邻接矩阵的 C 程序

📅  最后修改于: 2021-09-07 02:35:54             🧑  作者: Mango

给定一个由 N个顶点 1 到NM边的无向图,采用二维数组arr[][]的形式,其每行由两个数字XY 组成,表示 X 和 Y 之间存在一条边,任务是写用于创建给定图的邻接矩阵的 C 程序。

例子:

方法:想法是使用大小为NxN的方阵来创建邻接矩阵。以下是步骤:

  1. 创建一个大小为 NxN 的二维数组(比如Adj[N+1][N+1] )并将该矩阵的所有值初始化为零。
  2. 对于 arr[][] 中的每条边(比如X 和 Y ),将 Adj[X][Y]Adj[Y][X]处的值更新为 1,表示 X 和 Y 之间存在一条边。
  3. 为 arr[][] 中的所有对显示上述操作后的邻接矩阵。

下面是上述方法的实现:

// C program for the above approach
#include 
  
// N vertices and M Edges
int N, M;
  
// Function to create Adjacency Matrix
void createAdjMatrix(int Adj[][N + 1],
                     int arr[][2])
{
  
    // Initialise all value to this
    // Adjacency list to zero
    for (int i = 0; i < N + 1; i++) {
  
        for (int j = 0; j < N + 1; j++) {
            Adj[i][j] = 0;
        }
    }
  
    // Traverse the array of Edges
    for (int i = 0; i < M; i++) {
  
        // Find X and Y of Edges
        int x = arr[i][0];
        int y = arr[i][1];
  
        // Update value to 1
        Adj[x][y] = 1;
        Adj[y][x] = 1;
    }
}
  
// Function to print the created
// Adjacency Matrix
void printAdjMatrix(int Adj[][N + 1])
{
  
    // Traverse the Adj[][]
    for (int i = 1; i < N + 1; i++) {
        for (int j = 1; j < N + 1; j++) {
  
            // Print the value at Adj[i][j]
            printf("%d ", Adj[i][j]);
        }
        printf("\n");
    }
}
  
// Driver Code
int main()
{
  
    // Number of vertices
    N = 5;
  
    // Given Edges
    int arr[][2]
        = { { 1, 2 }, { 2, 3 }, 
            { 4, 5 }, { 1, 5 } };
  
    // Number of Edges
    M = sizeof(arr) / sizeof(arr[0]);
  
    // For Adjacency Matrix
    int Adj[N + 1][N + 1];
  
    // Function call to create
    // Adjacency Matrix
    createAdjMatrix(Adj, arr);
  
    // Print Adjacency Matrix
    printAdjMatrix(Adj);
  
    return 0;
}
输出:
0 1 0 0 1 
1 0 1 0 0 
0 1 0 0 0 
0 0 0 0 1 
1 0 0 1 0

时间复杂度: O(N 2 ) ,其中 N 是图中的顶点数。

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