Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Шпора.Дискретна..docx
Скачиваний:
31
Добавлен:
16.09.2019
Размер:
101.25 Кб
Скачать

11. Алгоритм бектрекінг. Приклади: пошук гамільтонових циклів у графі, задача про n ферзів та інші задачі.

Основна ідея методу полягає в тому, що розв’язок будується поступово починаючи або з третьої порожньої послід. (довжини 0), або з однойменної послід. (довжини 1). Тобто, якщо ми маємо деякий частковий розв’язок х1,…, хі, то намагаємось знайти таке допустиме значення xi+1, що не виключає можливість продовження до повного розв’язку. Якщо таке допустиме, але ще не використане значення хі+1 існує то долучаємо цю нову компоненту до часткового розв’язку і продовжуємо процес до послід. х1,..,хіі+1. Якщо значення хі+1 не існує то повертаємось назад до попередньої послід. х1,…,хі-1 і продовжуємо процес шукаючи нове, ще не використане значення хі і так далі.

Побудова гамільтонових циклів.

Починаємо з довільної вершини. Будуємо шлях без повторення вершин, доки це можливо, якщо вдалось пройти всі вершини, то перевіряємо чи існує ребро, яке з’єднує останню і початкову вершини цього шляху. Якщо описаний процес у певний момент неможливо продовжити, то повертаємось на одну вершину назад і намагаємось продовжити побудову шляху іншим способом.

Задача про n ферзів.

Як n ферзів можна розмістити на шахівниці nxn так, щоб жодні 2 не били один одного? Для розв’язування цієї задачі потрібно визначити n позицій на шахівниці nxn так, щоб жодні 2 позиції не були в одному рядку, в одному стовпчику і в одній діагоналі. Діагональ містить усі позиції з координатами (i,j) такі, що i+j=m для деякого m, або i-j=m (i – номер рядка, j – номер стовпця). Починаємо з порожньої шахівниці. На (k+1)-му кроці намагаємось поставити нового ферзі в (k+1)-му стовпці, причому в перших k стовпцях уже є ферзі. Перевіряємо клітинки в (k+1)-му стовпці, починаючи з верхньої, а саме, шукаємо таку позицію для ферзі, щоб він не був у рядку та діагоналі з тими ферзями, які вже є на шахівниці. Якщо це неможливо, то повертаємось до місця ферзя на попередньому k-му кроці і розміщаємо цього ферзя на наступному можливому рядку в цьому k-му стовпці, якщо такий рядок є. Якщо немає, то повертаємось до ферзя у (k-1)-му стовпці.

12. Каркаси графів. Способи їх побудови.

Нехай G – простий зв’язний граф. Каркасом, або з’єднувальним деревом графа G називають його підграф, який є деревом і містить всі вершини графа G. Нехай граф G має n вершин та m ребер. Для того, щоб отримати каркас, можна використати процедуру вилучення ребер, що належать простим циклам. У такому разі, очевидно, потрібно вилучати ϒ(G)=m-(n-1)=m-n+1 ребер. Число ϒ(G) – називають цикломатичним числом графа G. Побудова каркаса є поширеною задачею. Алгоритм, який полягає у вилученні ребер з простих циклів, не ефективний для комп’ютерної реалізації. Такий алгоритм вимагає ідентифікації простих циклів, що є складною задачею. Ефективним для комп’ютерної реалізації алгоритмом побудови каркаса є послідовний добір ребер у каркас. Це можна здійснити за допомогою обходу графа G як пошуком вглиб, так і пошуком вшир. Під час виконання цих алгоритмів природним чином будують каркас.

Т-ма. Нехай Т – каркас графа G, побудований пошуком вшир, починаючи з вершини R, тоді шлях із а до довільної вершини v в Т є найкоротшим шляхом із а до v у графі G.

Д-ня ґрунтується на аналізі алгоритму пошуку вшир у графі G і пропонується як вправа.

Зауваження. Якщо для побудови дерева найкоротших шляхів від вершини а використати алгоритм Дейкстри (вважаємо, що довжина кожного ребра =1), то отримаємо те саме дерево, що і у разі використання алгоритму пошуку вшир.