graph implementation c using adjacency list
Цей посібник пояснює реалізацію графіків у C ++. Ви також дізнаєтесь про різні типи, подання та застосування графіків:
Графік - це нелінійна структура даних. Графік може бути визначений як сукупність Вузлів, які також називаються 'вершинами' і 'ребрами', що з'єднують дві або більше вершин.
Графік також можна розглядати як циклічне дерево, де вершини не мають стосунків між батьками та дітьми, але підтримують складні відносини між ними.
тестові приклади на прикладах тестування програмного забезпечення
=> Клацніть тут, щоб переглянути абсолютну серію навчальних програм C ++.
Що ви дізнаєтесь:
Що таке графік на C ++?
Як було зазначено вище, графік на C ++ - це нелінійна структура даних, визначена як сукупність вершин і ребер.
Далі наведено приклад структури даних графіків.
Вище наведено приклад графіка G. Графік G - це набір вершин {A, B, C, D, E} і набір ребер {(A, B), (B, C), (A, D), (D, E), (E, C), (B, E), (B, D)}.
Типи графіків - спрямований та непрямий графік
Графік, у якого ребра не мають напрямків, називається неорієнтованим графом. Графік, показаний вище, є ненаправленим графіком.
Графік, на якому ребра мають напрямки, пов’язані з ними, називається Направленим графом.
Нижче наведено приклад спрямованого графіка.
У наведеному вище спрямованому графіку ребра утворюють впорядковану пару, де кожне ребро представляє певний шлях від однієї вершини до іншої вершини. Вершина, з якої ініціюється шлях, називається “ Початковий вузол ”, А вершина, до якої закінчується шлях, називається“ Кінцевий вузол '.
Таким чином, у наведеному графіку набір вершин дорівнює {A, B, C, D, E}, а набір ребер - {(A, B), (A, D), (B, C), (B, E ), (D, E) (E, C)}.
Ми обговоримо термінологію графіка або загальні терміни, що використовуються стосовно графіку нижче.
Графічна термінологія
- Вершина: Кожен вузол графіка називається вершиною. У наведеному графіку A, B, C і D - це вершини графіка.
- Край: Зв'язок або шлях між двома вершинами називається ребром. Він з'єднує дві або більше вершин. Різними ребрами на наведеному графіку є AB, BC, AD та DC.
- Сусідній вузол: На графіку, якщо два вузли з'єднані ребром, тоді вони називаються сусідніми вузлами або сусідами. На наведеному графіку вершини A і B з'єднані ребром AB. Таким чином A і B є сусідніми вузлами.
- Ступінь вузла: Кількість ребер, які з'єднані з певним вузлом, називається ступенем вузла. На наведеному графіку вузол A має ступінь 2.
- Шлях: Послідовність вузлів, якої нам потрібно дотримуватися, коли нам доводиться переходити з однієї вершини в іншу на графіку, називається шляхом. У нашому прикладі графіка, якщо нам потрібно перейти від вузла A до C, тоді шлях буде A-> B-> C.
- Закритий шлях: Якщо початковий вузол збігається з кінцевим, тоді цей шлях називається закритим.
- Простий шлях: Закритий шлях, у якому всі інші вузли відрізняються, називається простим шляхом.
- Цикл: Шлях, у якому немає повторюваних ребер або вершин, а перша і остання вершини однакові, називається циклом. На наведеному графіку A-> B-> C-> D-> A є циклом.
- Підключений графік: Зв’язаний графік - це той, у якому між кожною з вершин є шлях. Це означає, що не існує жодної вершини, яка була б ізольованою або не мала сполучного ребра. Графік, показаний вище, є пов'язаним графіком.
- Повний графік: Графік, в якому кожен вузол з'єднаний з іншим, називається Повний графік. Якщо N - загальна кількість вузлів у графіку, то повний графік містить N (N-1) / 2 кількість ребер.
- Зважений графік: Позитивне значення, присвоєне кожному ребру, що вказує на його довжину (відстань між вершинами, з'єднаними ребром), називається вагою. Графік, що містить зважені ребра, називається зваженим. Вага ребра e позначається w (e) і вказує на вартість обходу ребра.
- Діаграма: Диграф - це графік, на якому кожне ребро асоціюється з певним напрямком, і обхід може здійснюватися лише у визначеному напрямку.
Подання графіків
Спосіб, як структура даних графіків зберігається в пам'яті, називається 'поданням'. Графік може зберігатися як послідовне подання або як пов'язане представлення.
Обидва ці типи описані нижче.
Послідовне подання
Для послідовного представлення графіків ми використовуємо матрицю суміжності. Матриця суміжності - це матриця розміром n x n, де n - кількість вершин на графіку.
Рядки та стовпці матриці суміжності представляють вершини на графіку. Елемент матриці встановлюється в 1, коли між вершинами є ребро. Якщо краю немає, тоді для елемента встановлюється значення 0.
Нижче наведено приклад графіка, який показує матрицю суміжності.
Ми бачили матрицю суміжності для наведеного графіку. Зверніть увагу, що оскільки це ненаправлений графік, ми можемо сказати, що ребро присутнє в обох напрямках. Наприклад, оскільки ребро AB присутнє, ми можемо зробити висновок, що ребро BA також є.
У матриці суміжності ми можемо бачити взаємодії вершин, які є елементами матриці, які встановлюються на 1, коли присутнє ребро, і на 0, коли ребро відсутнє.
Побачимо тепер матрицю суміжності спрямованого графіка.
Як показано вище, елемент перетину в матриці суміжності буде дорівнювати 1 тоді і тільки тоді, коли є ребро, спрямоване від однієї вершини до іншої.
У наведеному графіку ми маємо два ребра від вершини А. Одне ребро закінчується вершиною B, а друге - вершиною C. Таким чином, у матриці суміжності перетин A & B встановлюється як 1 як перетин A & C.
Далі ми побачимо послідовне представлення зваженого графіка.
Нижче наведено зважений графік та відповідна йому матриця суміжності.
що таке файл SWF
Ми бачимо, що послідовне подання зваженого графа відрізняється від інших типів графіків. Тут ненульові значення в матриці суміжності замінюються фактичною вагою ребра.
Ребро AB має вагу = 4, тому в матриці суміжності ми встановлюємо перетин A і B на 4. Аналогічним чином, усі інші ненульові значення змінюються на їх відповідні ваги.
Список сумісності легше впровадити та дотримуватися. Обхід, тобто перевірка, чи є ребро від однієї вершини до іншої, займає час O (1), а видалення ребра також займає O (1).
Незалежно від того, чи є графік розрідженим (менше країв) або щільним, він завжди займає більше місця.
Зв’язане представництво
Ми використовуємо список суміжностей для пов'язаного представлення графіка. Представлення списку суміжності підтримує кожен вузол графіка та посилання на вузли, які прилягають до цього вузла. Коли ми обходимо всі сусідні вузли, ми встановлюємо наступний вказівник на нуль у кінці списку.
Спочатку розглянемо ненаправлений графік та його список суміжностей.
Як показано вище, у нас є зв’язаний список (список суміжності) для кожного вузла. Від вершини A ми маємо ребра до вершин B, C і D. Таким чином, ці вузли пов'язані з вузлом A у відповідному списку суміжності.
Далі ми будуємо список суміжностей для спрямованого графіка.
У наведеному вище графіку ми бачимо, що немає ребер, що походять від вершини E. Отже, список суміжностей для вершини E порожній.
Тепер побудуємо список суміжностей для зваженого графіка.
Для зваженого графіка ми додаємо додаткове поле у вузол списку суміжностей, щоб позначити вагу ребра, як показано вище.
Додавання вершин у список суміжностей простіше. Це також економить простір завдяки реалізації зв’язаного списку. Коли нам потрібно з'ясувати, чи є ребро між однією вершиною іншої, операція не є ефективною.
Основні операції для графіків
Нижче наведені основні операції, які ми можемо виконувати над структурою даних графіка:
- Додайте вершину: Додає вершину до графіка.
- Додати край: Додає ребро між двома вершинами графіка.
- Відображення вершин графіка: Відображення вершин графіка.
Впровадження графіка C ++ із використанням списку суміжності
Тепер ми представляємо реалізацію C ++, щоб продемонструвати простий графік, використовуючи список суміжностей.
Тут ми відобразимо список суміжностей для зваженого спрямованого графіка. Ми використовували дві структури для утримання списку суміжності та країв графіка. Список суміжності відображається як (початкова_вершина, кінцева_вершина, вага).
Програма С ++ така:
#include using namespace std; // stores adjacency list items struct adjNode { int val, cost; adjNode* next; }; // structure to store edges struct graphEdge { int start_ver, end_ver, weight; }; class DiaGraph{ // insert new nodes into adjacency list from given graph adjNode* getAdjListNode(int value, int weight, adjNode* head) { adjNode* newNode = new adjNode; newNode->val = value; newNode->cost = weight; newNode->next = head; // point new node to current head return newNode; } int N; // number of nodes in the graph public: adjNode **head; //adjacency list as array of pointers // Constructor DiaGraph(graphEdge edges[], int n, int N) { // allocate new node head = new adjNode*[N](); this->N = N; // initialize head pointer for all vertices for (int i = 0; i Вихід:
Вихід:
Список суміжності графіків
(start_vertex, end_vertex, вага):
(0, 2, 4) (0, 1, 2)
(1, 4, 3)
(2, 3, 2)
(3, 1, 4)
(4, 3, 3)
Застосування графіків
Обговоримо деякі застосування графіків.
- Графіки широко використовуються в інформатиці для зображення мережевих графіків або семантичних графіків або навіть для зображення потоку обчислень.
- Графіки широко використовуються в компіляторах для відображення розподілу ресурсів для процесів або для позначення аналізу потоку даних тощо.
- Графіки також використовуються для оптимізації запитів на мовах баз даних у деяких спеціалізованих компіляторах.
- На сайтах соціальних мереж графіки є основними структурами, що зображують мережу людей.
- Графіки широко використовуються для побудови транспортної системи, особливо дорожньої мережі. Популярним прикладом є карти Google, які широко використовують графіки для позначення напрямків у всьому світі.
Висновок
Графік - це популярна та широко використовувана структура даних, яка має багато додатків у самій галузі інформатики, крім інших областей. Графіки складаються з вершин і ребер, що з'єднують дві або більше вершин.
Графік може бути спрямованим або ненаправленим. Ми можемо представити графіки за допомогою матриці суміжності, яка є лінійним представленням, а також за допомогою списку суміжності. Ми також обговорили реалізацію графіка в цьому посібнику.
=> Дивіться тут, щоб ознайомитися з повним списком підручників з C ++.
Рекомендована література
- Підручник із розширеного списку Python (Сортування списку, зворотне, індексування, копіювання, приєднання, сума)
- Список Python - Створення, доступ, нарізка, додавання або видалення елементів
- Список IP-адрес маршрутизатора за замовчуванням для загальних марок бездротових маршрутизаторів
- 12 найкращих інструментів для створення лінійних графіків для створення приголомшливих лінійних графіків [2021 РЕЙТИНГИ]
- Пароль для входу маршрутизатора за замовчуванням для найкращих моделей маршрутизаторів (список 2021)
- Структура даних зв’язаного списку на C ++ з ілюстрацією
- Структура даних кругового зв’язаного списку на C ++ з ілюстрацією
- Подвійно пов’язана структура даних списку на C ++ з ілюстрацією