mafulechka
01 липня 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. }

Вам це подобається? Поділіться в соціальних мережах!

Коментарі

Only authorized users can post comments.
Please, Log in or Sign up