Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/37: Рейтинг темы: голосов - 37, средняя оценка - 4.62
0 / 0 / 0
Регистрация: 28.03.2019
Сообщений: 55

Объяснить алгоритм нахождения гамильтонова пути

22.04.2021, 12:58. Показов 8156. Ответов 4

Студворк — интернет-сервис помощи студентам
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#include <iostream>
#include <Windows.h>
#define n 5
 
using namespace std;
 
int c[n];   // номер хода, на котором посещается вершина
int path[n]; // номера посещаемых вершин
int v0 = 2;    // начальная вершина
 
int a[n][n] =
{
    0,1,1,1,0,
    1,0,0,0,1,
    1,0,0,1,1,
    1,0,1,0,1,
    0,1,1,1,0,
};
 
 
void printGam(void)
{
    int p;
    for (p = 0; p < n; p++)
        cout << path[p] << " ";
    cout << path[0];
    cout << endl;
}
 
//подпрограмма нахождения гамильтонова цикла
int gamilton(int k) // k = 1
{
    int v, q1 = 0;
    for (v = 0; v < n && !q1; v++) // обход матрицы
    {
        if (a[v][path[k - 1]] || a[path[k - 1]][v])
        {
            if (k == n && v == v0) q1 = 1;
            else 
                if (c[v] == -1) // формирует путь
                {
                    c[v] = k; // номер хода
                    path[k] = v; // занесение вершины
                    q1 = gamilton(k + 1);
                    if (!q1) c[v] = -1; 
                }
                else 
                    continue;
        }
    }   return q1; // если нашел путь возвращает единицу
}
 
void main()
{
    int j;
    cout << "Gamilton's circle:\n";
    for (j = 0; j < n; j++) 
        c[j] = -1;
    path[0] = v0;
    c[v0] = v0;
    if (gamilton(1))
        printGam();
    else
        cout << "No solutions\n";
}
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
22.04.2021, 12:58
Ответы с готовыми решениями:

А* Алгоритм нахождения пути
Доброго времени суток, Я пишу лабораторную по А* но алгоритм уже должен работать но ни как не хочет посмотрите плиз код, буду очень...

Алгоритм для нахождения максимального пути в графе
Добрый день, не могу написать программу для вычисления макс. пути на графе. Пытался преобразовать алгоритм Дейкстры, но ничего не...

Алгоритм Дейкстры нахождения кратчайшего пути от заданной точки пользователем
Ни как не могу понять, как реализовать, что бы пользователь выбирал начальную точку и конечную для нахождения кратчайшего пути.Есть...

4
Эксперт CЭксперт С++
 Аватар для liv
5120 / 4573 / 855
Регистрация: 07.10.2015
Сообщений: 9,462
22.04.2021, 14:36
Лучший ответ Сообщение было отмечено Паста как решение

Решение

Паста, программа взята отсюда ?

Держите прокомментированную программу:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#include <iostream>
#define n 5
 
using namespace std;
 
int c[n];           // номер хода, на котором посещается вершина
int path[n];        // номера посещаемых вершин
int v0 = 4;         // начальная вершина
 
int a[n][n] =       //матрица смежности
{
    0,1,1,1,0,
    1,0,0,0,1,
    1,0,0,1,1,
    1,0,1,0,1,
    0,1,1,1,0,
};
 
 
void printGam(void)
{
    int p;
    for (p = 0; p < n; p++)
        cout << path[p] << " ";
    cout << path[0];
    cout << endl;
}
 
//подпрограмма нахождения гамильтонова цикла
//k - номер прохода или количество найденных вершин пути, результат - массив path, возвращвет признак нахождения пути
int gamilton(int k) 
{
    int v;          //индекс вершины
    int q1 = 0;     //признак нахождения пути, сначала - не найдено
    for (v = 0; v < n && !q1; v++) // обход матрицы по всем вершинам и пока не найден путь
    {
        //есть ли ребро между текущей вершиной и вершиной, найденной при предыдущем вызове
        //если граф неориентированный, то оба используемых элемента матрицы должны быть равны
        //если ориентированный, то, по идее, надо смотреть только a[path[k - 1]][v]
        if (a[v][path[k - 1]] || a[path[k - 1]][v]) 
        {
            if (k == n && v == v0)          //если обошли все вершины и дошли до начальной,
                q1 = 1;                     // то путь найден
            else
                if (c[v] == -1)             //формируем путь, если в вершине v еще не были
                {
                    c[v] = k;               //номер прохода
                    path[k] = v;            //занесение вершины в найденный путь
                    q1 = gamilton(k + 1);   //ищем следующую вершину
                    if (!q1) c[v] = -1;     //если путь не найден, то помечаем текущую вершину, как непройденную
                }
                else
                    continue;               //если в вершине уже были, то на анализ следующей вершины
        }
    }   return q1;                          //возвращаем нашли или нет
}
 
int main()
{
    int j;
    cout << "Gamilton's circle:\n";
    for (j = 0; j < n; j++)
        c[j] = -1;                          //помечаем, что все вершины не пройдены
    path[0] = v0;                           //начинаем путь с вершины v0
    c[v0] = v0;                             // и она пройдена
    if (gamilton(1))                        //ищем путь, начиная с прохода 1
        printGam();
    else
        cout << "No solutions\n";
}
2
0 / 0 / 0
Регистрация: 28.03.2019
Сообщений: 55
22.04.2021, 14:53  [ТС]
Вы лучший!!!
0
0 / 0 / 0
Регистрация: 28.02.2020
Сообщений: 4
26.11.2022, 15:05
liv, Можете подсказать как здесь сделать, чтобы массив сам генерировал случайные числа?
0
Заблокирован
26.11.2022, 15:18
Цитата Сообщение от Данил_ка Посмотреть сообщение
чтобы массив сам генерировал случайные числа?
Здесь не просто "случайные числа", здесь неоринетированный граф задан матрицей смежности.
Это значит, что при добавлении ребра в массив заносится два значения. При этом вершины заданного ребра -V и W должны быть различными.
Учим матчасть.

Добавлено через 3 минуты
https://cyberleninka.ru/articl... tem/viewer
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
26.11.2022, 15:18
Помогаю со студенческими работами здесь

Алгоритм нахождения пути
Бодрого дня. Подсобите с решением такой задачи: 1) Есть карта маршрутов (синие линии), заданная отрезками (координаты начала и конца) ...

С# исправить ошибку и объяснить алгоритм нахождения седловых точек
Можете подправить косяки, и объяснить как найти номер всех седловых точек массива. ЗЫ матрица А имеет седловую точку Аij, если Аij является...

Алгоритм нахождения критического пути
Для нахождения критического пути служит алгоритм: 1) Эйлера 2) Гамильтона 3) Краскала 4) Дейкстры

Алгоритм Дейкстры нахождения кратчайшего пути
Вообщем имеется программа реализованная на c++ алгоритм дэйкстра для нахождения кротчайшего расстояния по дугам / в этой программе нужно...

Алгоритм нахождения уникального пути в графе
Здравствуйте. Есть граф: http://s4.postimg.org/t13iolg71/141205_0001.png Нужно что бы на выходе получались только уникальные пути. ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США. Нашел на реддите интересную статью под названием «Кто-нибудь знает, где получить бесплатный компьютер или. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru