Форум программистов, компьютерный форум, киберфорум
C/C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 06.10.2021
Сообщений: 14

Программа поиска гамильтонова цикла в графе, нужно убрать параллельность

15.12.2023, 18:50. Показов 810. Ответов 1

Студворк — интернет-сервис помощи студентам
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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
#include <iostream>
#include <vector>
#include <omp.h>
 
using namespace std;
 
// Функция для проверки, можно ли добавить вершину v в путь path
bool isSafe(int v, const vector<vector<int>>& graph, const vector<int>& path, int pos) {
    // Проверяем, смежна ли вершина v с предыдущей вершиной в пути
    if (graph[path[pos - 1]][v] == 0)
        return false;
 
    // Проверяем, была ли вершина v уже посещена в пути
    for (int i = 0; i < pos; ++i)
        if (path[i] == v)
            return false;
 
    return true;
}
 
// Рекурсивная функция для нахождения гамильтонова цикла в графе
bool hamiltonianCycleUtil(const vector<vector<int>>& graph, vector<int>& path, int pos, int numVertices) {
    // Базовый случай: если все вершины посещены, и последняя вершина
    // является смежной с начальной вершиной, то есть гамильтонов цикл
    if (pos == numVertices) {
        if (graph[path[pos - 1]][path[0]] == 1)
            return true;
        else
            return false;
    }
 
    // Рекурсивно перебираем все вершины, чтобы найти гамильтонов цикл
    for (int v = 1; v < numVertices; ++v) {
        if (isSafe(v, graph, path, pos)) {
            path[pos] = v;
 
            // Рекурсивный вызов для следующей вершины
            if (hamiltonianCycleUtil(graph, path, pos + 1, numVertices))
                return true;
 
            // Если гамильтонов цикл не найден, сбрасываем вершину
            path[pos] = -1;
        }
    }
 
    return false;
}
 
// Функция для нахождения гамильтонова цикла в графе
vector<int> findHamiltonianCycle(const vector<vector<int>>& graph) {
    int numVertices = graph.size();
    vector<int> path(numVertices, -1);
    vector<int> optimalPath(numVertices, -1);
 
    // Начинаем с вершины 0
    path[0] = 0;
 
    // Параллельная секция для перебора вершин
#pragma omp parallel
    {
        int numThreads = omp_get_num_threads();
        int threadNum = omp_get_thread_num();
 
        // Разделяем работу между потоками
        for (int v = threadNum; v < numVertices; v += numThreads) {
            // Копируем текущий путь в каждый поток
            vector<int> newPath(path);
 
            // Рекурсивный вызов для следующей вершины
            newPath[1] = v;
            bool foundCycle = hamiltonianCycleUtil(graph, newPath, 2, numVertices);
 
            // Если гамильтонов цикл найден в одном из потоков, обновляем главный путь
#pragma omp critical
            {
                if (foundCycle && (optimalPath[0] == -1 || newPath.size() < optimalPath.size())) {
                    optimalPath = newPath;
                }
            }
        }
    }
 
    return optimalPath;
}
 
int main() {
    // Пример графа смежности
    vector<vector<int>> graph = {
        {0, 1, 0, 1, 0},
        {1, 0, 1, 1, 1},
        {0, 1, 0, 0, 1},
        {1, 1, 0, 0, 1},
        {0, 1, 1, 1, 0}
    };
 
    vector<int> hamiltonianCycle = findHamiltonianCycle(graph);
 
    if (hamiltonianCycle[0] != -1) {
        cout << "Гамильтонов цикл: ";
        for (int vertex : hamiltonianCycle)
            cout << vertex << " ";
        cout << hamiltonianCycle[0] << endl;
    }
    else {
        cout << "Гамильтонов цикл не найден." << endl;
    }
 
    return 0;
}
Добавлено через 3 минуты
Если просто убрать все упоминания omp, отвер будет неверный.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
15.12.2023, 18:50
Ответы с готовыми решениями:

Алгебраический алгоритм поиска гамильтонова цикла в графе.
ребята, может кто-нибудь помочь?очень надо сдаю курсовую работу по теме ПОИСК ГАМИЛЬТОНОВА ЦИКЛА В ГРАФЕ кто может объяснить...

Алгоритм поиска Гамильтонова цикла в графе переборным методом Робертса и Флореса
Дорогие друзья, помогите пожалуйста с реализацией на haskell. Буду очень благодарен.

Поиск гамильтонова цикла в графе
Написать программу поиска гамильтонова цикла в графе.

1
 Аватар для igorrr37
2870 / 2017 / 991
Регистрация: 21.12.2010
Сообщений: 3,728
Записей в блоге: 15
16.12.2023, 00:55
Вот прога решает задачу коммивояжера - ищет гамильтонов цикл минимального веса динамическим программированием по подмножествам(маскам)
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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#include <iostream>
#include <vector>
#include <algorithm>
#include <climits>
#include <utility>
#include <cassert>
 
int main()
{
    // веса рёбер. INT_MAX - нет ребра. На главной диагонали - нули и граф симметричен относительно г.д. 
    std::vector<std::vector<int>> g
    {
        {0, 2, 1, 2, 1 },
        {2, 0, 2, 1, INT_MAX },
        {1, 2, 0, 2, INT_MAX },
        {2, 1, 2, 0, 1 },
        {1, INT_MAX, INT_MAX, 1, 0 },
    };
    for (int i = 0; i < g.size(); ++i)
    {
        assert(g[i][i] == 0);
        for (int j = 0; j < g[i].size(); ++j)
        {
            assert(g[i][j] == g[j][i]);
        }
    }
    std::vector<std::vector<std::pair<int, int>>> dp{ (unsigned)(1 << g.size()), std::vector<std::pair<int, int>>(g.size(), {INT_MAX, -1}) };
    for (int i = 0; i < dp[0].size(); ++i)
    {
        dp[0][i] = { 0, i };
    }
 
    // находит стартовую вершину для текущей маски и текущей вершины (т.в. включена в т.м.)
    auto startVertex = [&dp](int tm, int tv)
        {
            while (tm)
            {
                tm ^= (1 << tv);
                tv = dp[tm][tv].second;
            }
            return tv;
        };
 
    for (int mask = 0; mask < dp.size(); ++mask)
    {
        for (int u = 0; u < dp[mask].size(); ++u)
        {
            if (dp[mask][u].first == INT_MAX)
                continue;
            int newmask = mask | (1 << u);
            for (int v = 0; v < g[u].size(); ++v)
            {
                if (g[u][v] == INT_MAX || u == v)
                    continue;
                if ((mask & (1 << v)) == 0)
                {
                    if (dp[mask][u].first + g[u][v] < dp[newmask][v].first)
                    {
                        dp[newmask][v].first = dp[mask][u].first + g[u][v];
                        dp[newmask][v].second = u;
                    }
                }
                if (newmask == dp.size() - 1
                    && dp[mask][u].first + g[u][v] < dp[newmask][v].first
                    && v == startVertex(newmask, u))
                {
                    dp[newmask][v].first = dp[mask][u].first + g[u][v];
                    dp[newmask][v].second = u;
                }
            }
        }
    }
 
    auto imin = std::min_element(dp.back().begin(), dp.back().end());
    std::cout << "min len: " << imin->first << "\n";
 
    int tm = dp.size() - 1, tv = imin->second;
    while (tv != -1 && tm)
    {
        std::cout << tv << " ";
        tm ^= (1 << tv);
        tv = dp[tm][tv].second;
    }
}
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
16.12.2023, 00:55
Помогаю со студенческими работами здесь

Поиск гамильтонова цикла в графе
Написать программу гамильтонова цикла в графе для PascalABC Помогите пожалуйста Добавлено через 1 час 45 минут Есть программа для...

Поиск гамильтонова цикла в графе
ПОмогите плиииз!!! Написать программу поиска гамильтонова цикла в графе

Нахождение гамильтонова цикла в графе
Как заставить код работать? По условию задачи нужно найти гамильтонов цикл в графе. Если такового нет - решение не найдено. unit...

Поиск гамильтонова цикла в ориентированном графе
Честно пытался искать по форуму и не только, но так толком ничего и не нашел :\ Необходимо узнать, есть ли в орграфе гамильтонов цикл или...

Нахождение минимального гамильтонова цикла в графе
Добрый день! Мне нужно решить задачу о нахождении минимального гамильтонового цикла в графе g (матрица смежности). Нашла решение на...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
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