📜  在图的邻接矩阵表示中添加和删除边

📅  最后修改于: 2021-04-26 10:28:10             🧑  作者: Mango

先决条件:图形及其表示
给定由N个顶点组成的图的邻接矩阵g [] [] ,任务是在插入所有edge []并去除顶点(X,Y)之间的边缘之后修改矩阵。在邻接矩阵中,如果图的顶点ij之间存在边,则g [i] [j] = 1g [j] [i] = 1 。如果这两个顶点之间不存在边,则g [i] [j] = 0g [j] [i] = 0
例子:

方法:
初始化一个N x N尺寸的矩阵,并按照以下步骤操作:

  • 插入一条边:要在两个顶点之间(假设ij插入一条边),请将邻接矩阵中的相应值设置为1,即g [i] [j] = 1g [j] [i] = 1顶点ij存在。
  • 删除边:假设ij要删除两个顶点之间的边,请将邻接矩阵中的相应值设置为0。即,设置g [i] [j] = 0g [j] [i] =如果两个顶点ij同时存在,则为0

下面是上述方法的实现:

C++
// C++ program to add and remove edge
// in the adjacency matrix of a graph
  
#include 
using namespace std;
  
class Graph {
private:
    // Number of vertices
    int n;
  
    // Adjacency matrix
    int g[10][10];
  
public:
    // Constructor
    Graph(int x)
    {
        n = x;
  
        // Initializing each element of the
        // adjacency matrix to zero
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                g[i][j] = 0;
            }
        }
    }
  
    // Function to display adjacency matrix
    void displayAdjacencyMatrix()
    {
        // Displaying the 2D matrix
        for (int i = 0; i < n; i++) {
            cout << "\n";
            for (int j = 0; j < n; j++) {
                cout << " " << g[i][j];
            }
        }
    }
  
    // Function to update adjacency
    // matrix for edge insertion
    void addEdge(int x, int y)
    {
        // Checks if the vertices
        // exist in the graph
        if ((x < 0) || (x >= n)) {
            cout << "Vertex" << x
                 << " does not exist!";
        }
        if ((y < 0) || (y >= n)) {
            cout << "Vertex" << y
                 << " does not exist!";
        }
  
        // Checks if it is a self edge
        if (x == y) {
            cout << "Same Vertex!";
        }
  
        else {
            // Insert edge
            g[y][x] = 1;
            g[x][y] = 1;
        }
    }
  
    // Function to update adjacency
    // matrix for edge removal
    void removeEdge(int x, int y)
    {
        // Checks if the vertices
        // exist in the graph
        if ((x < 0) || (x >= n)) {
            cout << "Vertex" << x
                 << " does not exist!";
        }
        if ((y < 0) || (y >= n)) {
            cout << "Vertex" << y
                 << " does not exist!";
        }
  
        // Checks if it is a self edge
        if (x == y) {
            cout << "Same Vertex!";
        }
  
        else {
            // Remove edge
            g[y][x] = 0;
            g[x][y] = 0;
        }
    }
};
  
// Driver Code
int main()
{
    int N = 6, X = 2, Y = 3;
  
    Graph obj(N);
  
    // Adding edges to the graph
    obj.addEdge(0, 1);
    obj.addEdge(0, 2);
    obj.addEdge(0, 3);
    obj.addEdge(0, 4);
    obj.addEdge(1, 3);
    obj.addEdge(2, 3);
    obj.addEdge(2, 4);
    obj.addEdge(2, 5);
    obj.addEdge(3, 5);
  
    cout << "Adjacency matrix after"
         << " edge insertions:\n";
    obj.displayAdjacencyMatrix();
  
    obj.removeEdge(X, Y);
  
    cout << "\nAdjacency matrix after"
         << " edge removal:\n";
    obj.displayAdjacencyMatrix();
  
    return 0;
}


Java
// Java program to add and remove edge
// in the adjacency matrix of a graph
  
class Graph {
  
    // Number of vertices
    private int n;
  
    // Adjacency matrix
    private int[][] g = new int[10][10];
  
    // Constructor
    Graph(int x)
    {
        this.n = x;
  
        // Initializing each element of the
        // adjacency matrix to zero
        for (int i = 0; i < n; ++i) {
            for (int j = 0; j < n; ++j) {
                g[i][j] = 0;
            }
        }
    }
  
    // Function to display adjacency matrix
    public void displayAdjacencyMatrix()
    {
        // Displaying the 2D matrix
        for (int i = 0; i < n; ++i) {
            System.out.println();
            for (int j = 0; j < n; ++j) {
                System.out.print(" " + g[i][j]);
            }
        }
  
        System.out.println();
    }
  
    // Function to update adjacency
    // matrix for edge insertion
    public void addEdge(int x, int y)
    {
        // Checks if the vertices exists
        if ((x < 0) || (x >= n)) {
            System.out.printf("Vertex " + x
                              + " does not exist!");
        }
        if ((y < 0) || (y >= n)) {
            System.out.printf("Vertex " + y
                              + " does not exist!");
        }
  
        // Checks if it is a self edge
        if (x == y) {
            System.out.println("Same Vertex!");
        }
  
        else {
            // Insert edge
            g[y][x] = 1;
            g[x][y] = 1;
        }
    }
  
    // Function to update adjacency
    // matrix for edge removal
    public void removeEdge(int x, int y)
    {
        // Checks if the vertices exists
        if ((x < 0) || (x >= n)) {
            System.out.printf("Vertex " + x
                              + " does not exist!");
        }
        if ((y < 0) || (y >= n)) {
            System.out.printf("Vertex " + y
                              + " does not exist!");
        }
  
        // Checks if it is a self edge
        if (x == y) {
            System.out.println("Same Vertex!");
        }
  
        else {
            // Remove edge
            g[y][x] = 0;
            g[x][y] = 0;
        }
    }
}
  
// Driver Code
class Main {
    public static void main(String[] args)
    {
  
        int N = 6, X = 2, Y = 3;
        Graph obj = new Graph(N);
  
        // Inserting edges
        obj.addEdge(0, 1);
        obj.addEdge(0, 2);
        obj.addEdge(0, 3);
        obj.addEdge(0, 4);
        obj.addEdge(1, 3);
        obj.addEdge(2, 3);
        obj.addEdge(2, 4);
        obj.addEdge(2, 5);
        obj.addEdge(3, 5);
  
        System.out.println("Adjacency matrix after"
                           + " edge insertions:");
        obj.displayAdjacencyMatrix();
  
        obj.removeEdge(2, 3);
  
        System.out.println("\nAdjacency matrix after"
                           + " edge removal:");
        obj.displayAdjacencyMatrix();
    }
}


Python3
# Python3 program to add and remove edge
# in adjacency matrix representation of a graph 
      
class Graph: 
      
    # Number of vertices 
    __n = 0
      
    # Adjacency matrix 
    __g = [[0 for x in range(10)] 
              for y in range(10)] 
          
    # Constructor 
    def __init__(self, x): 
        self.__n = x 
      
        # Initializing each element of 
        # the adjacency matrix to zero 
        for i in range(0, self.__n): 
            for j in range(0, self.__n): 
                self.__g[i][j] = 0
                  
    # Function to display adjacency matrix             
    def displayAdjacencyMatrix(self):
          
        # Displaying the 2D matrix 
        for i in range(0, self.__n): 
            print() 
            for j in range(0, self.__n): 
                print("", self.__g[i][j], end = "") 
      
    # Function to update adjacency 
    # matrix for edge insertion             
    def addEdge(self, x, y): 
          
        # Checks if the vertices
        # exist in the graph 
        if (x < 0) or (x >= self.__n): 
            print("Vertex {} does not exist!".format(x))
        if (y < 0) or (y >= self.__n): 
            print("Vertex {} does not exist!".format(y))
              
        # Checks if it is a self edge 
        if(x == y): 
            print("Same Vertex!")
  
        else:
              
            # Adding edge between the vertices 
            self.__g[y][x] = 1
            self.__g[x][y] = 1
      
    # Function to update adjacency 
    # matrix for edge removal         
    def removeEdge(self, x, y):
          
        # Checks if the vertices
        # exist in the graph 
        if (x < 0) or (x >= self.__n): 
            print("Vertex {} does not exist!".format(x))
        if (y < 0) or (y >= self.__n): 
            print("Vertex {} does not exist!".format(y))
              
        # Checks if it is a self edge 
        if(x == y): 
            print("Same Vertex!")
  
        else:
              
            # Remove edge from between
            # the vertices 
            self.__g[y][x] = 0
            self.__g[x][y] = 0
  
# Driver code    
  
# Creating an object of class Graph 
obj = Graph(6); 
          
# Adding edges to the graph 
obj.addEdge(0, 1)
obj.addEdge(0, 2) 
obj.addEdge(0, 3) 
obj.addEdge(0, 4)
obj.addEdge(1, 3)
obj.addEdge(2, 3)
obj.addEdge(2, 4)
obj.addEdge(2, 5)
obj.addEdge(3, 5)
      
# Edges added to the adjacency matrix
print("Adjacency matrix after "
      "edge insertions:\n")
obj.displayAdjacencyMatrix();
          
# Removing the edge between vertices
# "2" and "3" from the graph 
obj.removeEdge(2, 3); 
      
# The adjacency matrix after 
# removing the edge
print("\nAdjacency matrix after " 
      "edge removal:\n")
obj.displayAdjacencyMatrix();
  
# This code is contributed by amarjeet_singh


C#
// C# program to add and remove edge 
// in adjacency matrix representation 
// of a graph
using System; 
      
class Graph{
      
// Number of vertices 
private int n; 
  
// Adjacency matrix 
private int[,] g = new int[10, 10]; 
  
// Constructor 
public Graph(int x)
{ 
    this.n = x; 
  
    // Initializing each element of 
    // the adjacency matrix to zero 
    for(int i = 0; i < n; ++i)
    { 
        for(int j = 0; j < n; ++j)
        { 
            g[i, j] = 0; 
        } 
    } 
} 
  
// Function to display adjacency matrix 
public void displayAdjacencyMatrix() 
{
      
    // Displaying the 2D matrix 
    for(int i = 0; i < n; ++i)
    { 
        Console.WriteLine(); 
        for(int j = 0; j < n; ++j) 
        { 
            Console.Write(" " + g[i, j]); 
        } 
    } 
} 
  
// Function to update adjacency 
// matrix for edge insertion 
public void addEdge(int x, int y)
{
      
    // Checks if the vertices exist
    // in the graph 
    if ((x < 0) || (x >= n))
    { 
        Console.WriteLine("Vertex {0} does " +
                          "not exist!", x);
    }
    if ((y < 0) || (y >= n))
    {
        Console.WriteLine("Vertex {0} does " + 
                          "not exist!", y);
    } 
  
    // Checks if it is a self edge
    if (x == y)
    { 
        Console.WriteLine("Same Vertex!"); 
    }
      
    else 
    { 
          
        // Adding edge between the vertices 
        g[y, x] = 1; 
        g[x, y] = 1; 
    }
} 
  
// Function to update adjacency 
// matrix for edge removal 
public void removeEdge(int x, int y)
{ 
      
    // Checks if the vertices exist 
    // in the graph 
    if ((x < 0) || (x >= n))
    { 
        Console.WriteLine("Vertex {0} does" +
                          "not exist!", x);
    }
    if ((y < 0) || (y >= n))
    {
        Console.WriteLine("Vertex {0} does" +
                          "not exist!", y);
    } 
  
    // Checks if it is a self edge
    if (x == y)
    { 
        Console.WriteLine("Same Vertex!"); 
    }
      
    else 
    { 
          
        // Remove edge from between 
        // the vertices 
        g[y, x] = 0; 
        g[x, y] = 0; 
    }
} 
} 
      
class GFG{ 
      
// Driver code 
public static void Main(String[] args)
{ 
      
    // Creating an object of class Graph 
    Graph obj = new Graph(6); 
  
    // Adding edges to the graph 
    obj.addEdge(0, 1); 
    obj.addEdge(0, 2); 
    obj.addEdge(0, 3); 
    obj.addEdge(0, 4);
    obj.addEdge(1, 3);
    obj.addEdge(2, 3);
    obj.addEdge(2, 4);
    obj.addEdge(2, 5);
    obj.addEdge(3, 5);
  
    // Edges added to the adjacency matrix
    Console.WriteLine("Adjacency matrix after " +
                      "edge insertions:\n");
    obj.displayAdjacencyMatrix(); 
  
    // Removing the edge between vertices
    // "2" and "3" from the graph 
    obj.removeEdge(2, 3); 
      
    // The adjacency matrix after
    // removing the edge
    Console.WriteLine("\nAdjacency matrix after " +
                      "edge removal:");
    obj.displayAdjacencyMatrix();
} 
}
  
// This code is contributed by amarjeet_singh


输出:
Adjacency matrix after edge insertions:

 0 1 1 1 1 0
 1 0 0 1 0 0
 1 0 0 1 1 1
 1 1 1 0 0 1
 1 0 1 0 0 0
 0 0 1 1 0 0
Adjacency matrix after edge removal:

 0 1 1 1 1 0
 1 0 0 1 0 0
 1 0 0 0 1 1
 1 1 0 0 0 1
 1 0 1 0 0 0
 0 0 1 1 0 0

时间复杂度:边的插入和删除需要O(1)复杂度,而需要O(N 2 )来显示邻接矩阵。
辅助空间: O(N 2 )