Вместо того, чтобы помечать вершины, мы будем просто приравнивать к нулю соответствующие элементы матрицы смежности рассматриваемого графа, а также приравнивать к нулю элементы, симметричные данному относительно главной диагонали. Иными словами, если мы хотим приравнять к нулю элемент с индексами i и j, то мы так же приравниваем к нулю элемент с индексами j и i. Это обусловлено тем, что в данной работе мы рассматриваем неориентированный граф, в матрице смежности которого все элементы симметричны относительно главной диагонали, и если не удалять элементы симметрично, алгоритм может работать неправильно.
Для выполнения алгоритма вручную рассмотрим следующий неориентированный граф, состоящий из 22 вершин.
Будем следовать возрастанию чисел.
Выполнение алгоритма:
1. «1» - начальная вершина (п.1)
2. «1» -> «2» (п.2) («2» - помечена как «были»)
3. «2» -> «3» (п.2) («3» - помечена как «были»)
4. «3» -> «7» (п.2) («7» - помечена как «были»)
5. «7» -> «8» (п.2) («8» - помечена как «были»)
6. «8» -> «9» (п.2) («9» - помечена как «были»)
7. «9» -> «10» (п.2) («10» - помечена как «были»)
8. «10» -> «11» (п.2) («11» - помечена как «были»)
9. «11» -> «12» (п.2) («12» - помечена как «были»)
10. «12» -> «11» (п.3) (конец ветви графа)
11. «11» -> «13» (п.2) («13» - помечена как «были»)
12. «13» -> «11» (п.3) (конец ветви графа)
13. «11» -> «14» (п.2) («14» - помечена как «были»)
14. «14» -> «11» (п.3) (конец ветви графа)
15. «11» -> «10» (п.3) (помеченная вершина)
16. «10» -> «9» (п.3) (помеченная вершина)
17. «9» -> «16» (п.2) («16» - помечена как «были»)
18. «16» -> «17» (п.2) («17» - помечена как «были»)
19. «17» -> «16» (п.3) (конец ветви графа)
20. «16» -> «18» (п.2) («18» - помечена как «были»)
21. «18» -> «19» (п.2) («19» - помечена как «были»)
22. «19» -> «18» (п.3) (конец ветви графа)
23. «18» -> «16» (п.3) (помеченная вершина)
24. «16» -> «9» (п.3) (помеченная вершина)
25. «9» -> «8» (п.3) (помеченная вершина)
26. «8» -> «15» (п.2) («15» - помечена как «были»)
27. «15» -> «20» (п.2) («20» - помечена как «были»)
28. «20» -> «21» (п.2) («21» - помечена как «были»)
29. «21» -> «22» (п.2) («22» - помечена как «были»)
30. «22» -> «21» (п.3) (помеченная вершина)
31. «21» -> «20» (п.3) (помеченная вершина)
32. «20» -> «15» (п.3) (помеченная вершина)
33. «15» -> «8» (п.3) (помеченная вершина)
34. «8» -> «7» (п.3) (помеченная вершина)
35. «7» -> «4» (п.2) («4» - помечена как «были»)
36. «4» -> «6» (п.2) («6» - помечена как «были»)
37. «6» -> «4» (п.3) (конец ветви графа)
38. «4» -> «7» (п.3) (помеченная вершина)
39. «7» -> «5» (п.2) («5» - помечена как «были»)
40. «5» -> «7» (п.3) (помеченная вершина)
41. «7» -> «3» (п.3) (помеченная вершина)
42. «3» -> «2» (п.3) (помеченная вершина)
43. «2» -> «1» (п.3) (помеченная вершина)
44. Из «1» больше не попасть в неотмеченные вершины
45. Конец
#include <iostream>
using namespace std;
int matr[22][22] = {
{0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1},
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1},
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0}
};
void dfs(int i)
{
for (int j = 0; j < 22; j++)
{
if (matr[i][j] == 1)
{
cout << '(' << i+1 << '-' << j+1 << ") ";
matr[i][j] = 0;
matr[j][i] = 0;
dfs(j);
}
}
}
int main()
{
cout << "Visited ligaments:\n";
dfs(0);
return 0;
}
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.