Список суміжності представляє граф як масиву пов'язаного списку.
Індекс масиву представляє вершину і кожен елемент у його зв'язаному списку, а також репрезентує інші вершини, які утворюють ребро з вершиною.
Представлення списку суміжності
Граф та його еквівалентне подання списку суміжності показані нижче.
Список суміжності ефективний з точки зору зберігання, тому що нам потрібно зберігати лише значення для ребер. Для розрідженого графа з мільйонами вершин та ребер це може означати багато заощадженого простору.
Структура списку суміжності
Найпростішому списку суміжності потрібна структура даних вузла зберігання вершини і структура даних графа в організацію вузлів.
Ми наближаємося до основного визначення графа - сукупності вершин та ребер {V, E}. Для простоти ми використовуємо немаркований граф, а чи не позначений, тобто вершини ідентифікуються з їхньої індексам 0,1,2,3.
Давайте розглянемо структуру даних нижче.
struct node { int vertex; struct node* next; }; struct Graph { int numVertices; struct node** adjLists; };
Не дозволяйте struct node*
adjLists приголомшити вас.
Нам потрібно зберегти покажчик struct node
. Тому, як ми не знаємо, скільки вершин буде у графі, тож не можемо створити масив пов'язаних списків під час компіляції.
Список суміжності C++
Це та сама структура, але за допомогою вбудованого списку структур даних STL в C ++ ми робимо структуру трохи чистіше. Ми також можемо абстрагувати деталі реалізації.
class Graph { int numVertices; list<int> *adjLists; public: Graph(int V); void addEdge(int src, int dest); };
Список суміжності Java
Ми використовуємо Java Collections для зберігання масиву пов'язаних списків.
class Graph { private int numVertices; private LinkedList<integer> adjLists[]; }
Тип LinkedList визначає, які дані ви хочете зберегти у ньому. Для позначеного графа ви можете зберігати словник замість цілого значення.
Список суміжності Python
Є причина, через яку Python отримує так багато "кохання". Простий словник вершин та його ребер є достатнім уявленням графа. Ви можете зробити вершину настільки складною, як захочете.
graph = {'A': set(['B', 'C']), 'B': set(['A', 'D', 'E']), 'C': set(['A', 'F']), 'D': set(['B']), 'E': set(['B', 'F']), 'F': set(['C', 'E'])}
Код списку суміжності в C
#include <stdio.h> #include <stdlib.h> struct node { int vertex; struct node* next; }; struct node* createNode(int); struct Graph { int numVertices; struct node** adjLists; }; struct Graph* createGraph(int vertices); void addEdge(struct Graph* graph, int src, int dest); void printGraph(struct Graph* graph); int main() { struct Graph* graph = createGraph(6); addEdge(graph, 0, 1); addEdge(graph, 0, 2); addEdge(graph, 1, 2); addEdge(graph, 1, 4); addEdge(graph, 1, 3); addEdge(graph, 2, 4); addEdge(graph, 3, 4); addEdge(graph, 4, 6); addEdge(graph, 5, 1); addEdge(graph, 5, 6); printGraph(graph); return 0; } struct node* createNode(int v) { struct node* newNode = malloc(sizeof(struct node)); newNode->vertex = v; newNode->next = NULL; return newNode; } struct Graph* createGraph(int vertices) { struct Graph* graph = malloc(sizeof(struct Graph)); graph->numVertices = vertices; graph->adjLists = malloc(vertices * sizeof(struct node*)); int i; for (i = 0; i < vertices; i++) graph->adjLists[i] = NULL; return graph; } void addEdge(struct Graph* graph, int src, int dest) { // Add edge from src to dest struct node* newNode = createNode(dest); newNode->next = graph->adjLists[src]; graph->adjLists[src] = newNode; // Add edge from dest to src newNode = createNode(src); newNode->next = graph->adjLists[dest]; graph->adjLists[dest] = newNode; } void printGraph(struct Graph* graph) { int v; for (v = 0; v < graph->numVertices; v++) { struct node* temp = graph->adjLists[v]; printf("\n Adjacency list of vertex %d\n ", v); while (temp) { printf("%d -> ", temp->vertex); temp = temp->next; } printf("\n"); } }
Код списку суміжності C++
#include <iostream> #include <list> using namespace std; class Graph { int numVertices; list *adjLists; public: Graph(int V); void addEdge(int src, int dest); }; Graph::Graph(int vertices) { numVertices = vertices; adjLists = new list[vertices]; } void Graph::addEdge(int src, int dest) { adjLists[src].push_front(dest); } int main() { Graph g(4); g.addEdge(0, 1); g.addEdge(0, 2); g.addEdge(1, 2); g.addEdge(2, 3); return 0; }
Код списку суміжності Java
import java.io.*; import java.util.*; class Graph { private int numVertices; private LinkedList<Integer> adjLists[]; Graph(int vertices) { numVertices = vertices; adjLists = new LinkedList[vertices]; for (int i = 0; i < vertices; i++) adjLists[i] = new LinkedList(); } void addEdge(int src, int dest) { adjLists[src].add(dest); } public static void main(String args[]) { Graph g = new Graph(4); g.addEdge(0, 1); g.addEdge(0, 2); g.addEdge(1, 2); g.addEdge(2, 3); } }