mafulechka
15 июля 2019 г. 13:37

Матрица смежности

Матрица смежности - это способ представления графа G = {V, E} в виде матрицы логических значений.


Представление матрицы смежности

Размер матрицы VxV, где V - количество вершин в графе, а значение записи Aij равно 1 или 0, в зависимости от того, существует ли ребро от вершины i до вершины j.

Пример матрицы смежности

Изображение ниже показывает график и его эквивалентную матрицу смежности.

В случае неориентированного графа матрица симметрична относительно диагонали, потому что у каждого ребра (i, j) также есть ребро (j, i).

Плюсы матрицы смежности

Основные операции, такие как добавление ребра, удаление ребра и проверка наличия ребра от вершины i до вершины j, являются чрезвычайно эффективными по времени операциями. Операциями с постоянным временем.

Если граф плотный и число ребер велико, матрица смежности должна стать первым выбором. Даже если граф и матрица смежности разрежены, мы можем представить ее, используя структуры данных для разреженной матрицы.

Однако самое большое преимущество исходит от использования матриц. Последние достижения в области аппаратного обеспечения позволяют нам выполнять даже дорогостоящие матричные операции на графическом процессоре (GPU).

Выполняя операции над смежной матрицей, мы можем получить важную информацию о природе графа и взаимосвязи между его вершинами.

Минусы матрицы смежности

Из-за требования к пространству матрицы смежности VxV может быть недостаточно памяти. Но обычно графы не имеют слишком много соединений, и это главная причина, почему списки смежности являются лучшим выбором для большинства задач.

Хотя базовые операции просты, такие операции, как inEdges и outEdges, дороги при использовании представления матрицы смежности.

Код матрицы смежности

Если вы знаете, как создавать двумерные массивы, значит вы также знаете, как создать матрицу смежности.

Матрица смежности в C++

  1. #include <iostream>
  2. using namespace std;
  3. class Graph {
  4. private:
  5. bool** adjMatrix;
  6. int numVertices;
  7. public:
  8. Graph(int numVertices) {
  9. this->numVertices = numVertices;
  10. adjMatrix = new bool*[numVertices];
  11. for (int i = 0; i < numVertices; i++) {
  12. adjMatrix[i] = new bool[numVertices];
  13. for (int j = 0; j < numVertices; j++)
  14. adjMatrix[i][j] = false;
  15. }
  16. }
  17.  
  18. void addEdge(int i, int j) {
  19. adjMatrix[i][j] = true;
  20. adjMatrix[j][i] = true;
  21. }
  22.  
  23. void removeEdge(int i, int j) {
  24. adjMatrix[i][j] = false;
  25. adjMatrix[j][i] = false;
  26. }
  27.  
  28. bool isEdge(int i, int j) {
  29. return adjMatrix[i][j];
  30. }
  31. void toString() {
  32. for (int i = 0; i < numVertices; i++) {
  33. cout << i << " : ";
  34. for (int j = 0; j < numVertices; j++)
  35. cout << adjMatrix[i][j] << " ";
  36. cout << "\n";
  37. }
  38. }
  39.  
  40. ~Graph() {
  41. for (int i = 0; i < numVertices; i++)
  42. delete[] adjMatrix[i];
  43. delete[] adjMatrix;
  44. }
  45. };
  46. int main(){
  47. Graph g(4);
  48.  
  49. g.addEdge(0, 1);
  50. g.addEdge(0, 2);
  51. g.addEdge(1, 2);
  52. g.addEdge(2, 0);
  53. g.addEdge(2, 3);
  54. g.toString();
  55. /* Outputs
  56. 0: 0 1 1 0
  57. 1: 1 0 1 0
  58. 2: 1 1 0 1
  59. 3: 0 0 1 0
  60. */
  61. }

Матрица смежности в Java

  1. public class Graph {
  2. private boolean adjMatrix[][];
  3. private int numVertices;
  4.  
  5. public Graph(int numVertices) {
  6. this.numVertices = numVertices;
  7. adjMatrix = new boolean[numVertices][numVertices];
  8. }
  9.  
  10. public void addEdge(int i, int j) {
  11. adjMatrix[i][j] = true;
  12. adjMatrix[j][i] = true;
  13. }
  14.  
  15. public void removeEdge(int i, int j) {
  16. adjMatrix[i][j] = false;
  17. adjMatrix[j][i] = false;
  18. }
  19.  
  20. public boolean isEdge(int i, int j) {
  21. return adjMatrix[i][j];
  22. }
  23. public String toString() {
  24. StringBuilder s = new StringBuilder();
  25. for (int i = 0; i < numVertices; i++) {
  26. s.append(i + ": ");
  27. for (boolean j : adjMatrix[i]) {
  28. s.append((j?1:0) + " ");
  29. }
  30. s.append("\n");
  31. }
  32. return s.toString();
  33. }
  34. public static void main(String args[])
  35. {
  36. Graph g = new Graph(4);
  37.  
  38. g.addEdge(0, 1);
  39. g.addEdge(0, 2);
  40. g.addEdge(1, 2);
  41. g.addEdge(2, 0);
  42. g.addEdge(2, 3);
  43.  
  44. System.out.print(g.toString());
  45. /* Outputs
  46. 0: 0 1 1 0
  47. 1: 1 0 1 0
  48. 2: 1 1 0 1
  49. 3: 0 0 1 0
  50. */
  51. }
  52. }

Матрица смежности в Python

  1. class Graph(object):
  2. def __init__(self, size):
  3. self.adjMatrix = []
  4. for i in range(size):
  5. self.adjMatrix.append([0 for i in range(size)])
  6. self.size = size
  7. def addEdge(self, v1, v2):
  8. if v1 == v2:
  9. print("Same vertex %d and %d" % (v1, v2))
  10. self.adjMatrix[v1][v2] = 1
  11. self.adjMatrix[v2][v1] = 1
  12. def removeEdge(self, v1, v2):
  13. if self.adjMatrix[v1][v2] == 0:
  14. print("No edge between %d and %d" % (v1, v2))
  15. return
  16. self.adjMatrix[v1][v2] = 0
  17. self.adjMatrix[v2][v1] = 0
  18. def containsEdge(self, v1, v2):
  19. return True if self.adjMatrix[v1][v2] > 0 else False
  20. def __len__(self):
  21. return self.size
  22.  
  23. def toString(self):
  24. for row in self.adjMatrix:
  25. for val in row:
  26. print('{:4}'.format(val)),
  27. print
  28.  
  29. def main():
  30. g = Graph(5)
  31. g.addEdge(0, 1);
  32. g.addEdge(0, 2);
  33. g.addEdge(1, 2);
  34. g.addEdge(2, 0);
  35. g.addEdge(2, 3);
  36.  
  37. g.toString()
  38.  
  39. if __name__ == '__main__':
  40. main()

Вам это нравится? Поделитесь в социальных сетях!

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь