mafulechka
1 июля 2019 г. 14:22

Список смежности

Список смежности представляет граф в виде массива связанного списка.


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

Представление списка смежности

Граф и его эквивалентное представление списка смежности показаны ниже.

Список смежности эффективен с точки зрения хранения, потому что нам нужно хранить только значения для ребер. Для разреженного графа с миллионами вершин и ребер это может означать много сэкономленного пространства.

Структура списка смежности

Самому простому списку смежности требуется структура данных узла для хранения вершины и структура данных графа для организации узлов.

Мы приближаемся к основному определению графа - совокупности вершин и ребер {V, E}. Для простоты мы используем немаркированный граф, а не помеченный, то есть вершины идентифицируются по их индексам 0,1,2,3.

Давайте рассмотрим структуру данных ниже.

  1. struct node
  2. {
  3. int vertex;
  4. struct node* next;
  5. };
  6. struct Graph
  7. {
  8. int numVertices;
  9. struct node** adjLists;
  10. };

Не позволяйте struct node* adjLists ошеломить вас.
Нам нужно сохранить указатель struct node
. Потому, как мы не знаем, сколько вершин будет в графе, и поэтому не можем создать массив связанных списков во время компиляции.

Список смежности C ++

Это та же самая структура, но с помощью встроенного списка структур данных STL в C ++ мы делаем структуру немного чище. Мы также можем абстрагировать детали реализации.

  1. class Graph
  2. {
  3. int numVertices;
  4. list<int> *adjLists;
  5.  
  6. public:
  7. Graph(int V);
  8. void addEdge(int src, int dest);
  9. };

Список смежности Java

Мы используем Java Collections для хранения массива связанных списков.

  1. class Graph
  2. {
  3. private int numVertices;
  4. private LinkedList<integer> adjLists[];
  5. }

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

Список смежности Python

Есть причина, по которой Python получает так много "любви". Простой словарь вершин и его ребер является достаточным представлением графа. Вы можете сделать вершину настолько сложной, насколько захотите.

  1. graph = {'A': set(['B', 'C']),
  2. 'B': set(['A', 'D', 'E']),
  3. 'C': set(['A', 'F']),
  4. 'D': set(['B']),
  5. 'E': set(['B', 'F']),
  6. 'F': set(['C', 'E'])}

Код списка смежности в C

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. struct node
  5. {
  6. int vertex;
  7. struct node* next;
  8. };
  9. struct node* createNode(int);
  10. struct Graph
  11. {
  12. int numVertices;
  13. struct node** adjLists;
  14. };
  15. struct Graph* createGraph(int vertices);
  16. void addEdge(struct Graph* graph, int src, int dest);
  17. void printGraph(struct Graph* graph);
  18. int main()
  19. {
  20. struct Graph* graph = createGraph(6);
  21. addEdge(graph, 0, 1);
  22. addEdge(graph, 0, 2);
  23. addEdge(graph, 1, 2);
  24. addEdge(graph, 1, 4);
  25. addEdge(graph, 1, 3);
  26. addEdge(graph, 2, 4);
  27. addEdge(graph, 3, 4);
  28. addEdge(graph, 4, 6);
  29. addEdge(graph, 5, 1);
  30. addEdge(graph, 5, 6);
  31.  
  32. printGraph(graph);
  33.  
  34. return 0;
  35. }
  36.  
  37.  
  38. struct node* createNode(int v)
  39. {
  40. struct node* newNode = malloc(sizeof(struct node));
  41. newNode->vertex = v;
  42. newNode->next = NULL;
  43. return newNode;
  44. }
  45.  
  46. struct Graph* createGraph(int vertices)
  47. {
  48. struct Graph* graph = malloc(sizeof(struct Graph));
  49. graph->numVertices = vertices;
  50.  
  51. graph->adjLists = malloc(vertices * sizeof(struct node*));
  52.  
  53. int i;
  54. for (i = 0; i < vertices; i++)
  55. graph->adjLists[i] = NULL;
  56.  
  57. return graph;
  58. }
  59.  
  60. void addEdge(struct Graph* graph, int src, int dest)
  61. {
  62. // Add edge from src to dest
  63. struct node* newNode = createNode(dest);
  64. newNode->next = graph->adjLists[src];
  65. graph->adjLists[src] = newNode;
  66.  
  67. // Add edge from dest to src
  68. newNode = createNode(src);
  69. newNode->next = graph->adjLists[dest];
  70. graph->adjLists[dest] = newNode;
  71. }
  72.  
  73. void printGraph(struct Graph* graph)
  74. {
  75. int v;
  76. for (v = 0; v < graph->numVertices; v++)
  77. {
  78. struct node* temp = graph->adjLists[v];
  79. printf("\n Adjacency list of vertex %d\n ", v);
  80. while (temp)
  81. {
  82. printf("%d -> ", temp->vertex);
  83. temp = temp->next;
  84. }
  85. printf("\n");
  86. }
  87. }

Код списка смежности в C++

  1. #include <iostream>
  2. #include <list>
  3. using namespace std;
  4.  
  5. class Graph
  6. {
  7. int numVertices;
  8. list *adjLists;
  9.  
  10. public:
  11. Graph(int V);
  12. void addEdge(int src, int dest);
  13. };
  14.  
  15. Graph::Graph(int vertices)
  16. {
  17. numVertices = vertices;
  18. adjLists = new list[vertices];
  19. }
  20.  
  21. void Graph::addEdge(int src, int dest)
  22. {
  23. adjLists[src].push_front(dest);
  24. }
  25.  
  26.  
  27. int main()
  28. {
  29. Graph g(4);
  30. g.addEdge(0, 1);
  31. g.addEdge(0, 2);
  32. g.addEdge(1, 2);
  33. g.addEdge(2, 3);
  34.  
  35. return 0;
  36. }

Код списка смежности Java

  1. import java.io.*;
  2. import java.util.*;
  3. class Graph
  4. {
  5. private int numVertices;
  6. private LinkedList<Integer> adjLists[];
  7.  
  8. Graph(int vertices)
  9. {
  10. numVertices = vertices;
  11. adjLists = new LinkedList[vertices];
  12.  
  13. for (int i = 0; i < vertices; i++)
  14. adjLists[i] = new LinkedList();
  15. }
  16.  
  17. void addEdge(int src, int dest)
  18. {
  19. adjLists[src].add(dest);
  20. }
  21.  
  22. public static void main(String args[])
  23. {
  24. Graph g = new Graph(4);
  25.  
  26. g.addEdge(0, 1);
  27. g.addEdge(0, 2);
  28. g.addEdge(1, 2);
  29. g.addEdge(2, 3);
  30. }
  31. }

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

Комментарии

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