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

Провести для всех вершин графа обход в глубину

08.11.2012, 10:04. Показов 11809. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите!
Необходимо провести для всех вершин графа обход в глубину
вот сам граф
1
2 5 3 4
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
08.11.2012, 10:04
Ответы с готовыми решениями:

Обход графа в глубину
string graph = new string; graph = "a"; graph = "0"; //а graph = "b";//b graph =...

Обход графа в глубину
необходимо разбить неориентированный граф на связные компоненты на вход поступает матрица смежности using System; using...

Обход графа в глубину. Создать класс «стек»
Обход графа в глубину. Создать класс «стек». Реализовать в нем методы добавления элемента в стек, удаления, распечатки элементов, проверки...

1
 Аватар для Ese
11 / 11 / 9
Регистрация: 16.12.2011
Сообщений: 28
08.11.2012, 15:23
Лучший ответ Сообщение было отмечено mik-a-el как решение

Решение

Не совсем понимаю какие у вас связи графа, поэтому меняйте названия вертексов, и ставьте связи сами (edge) (Смотри Program.Main).
Вот пример из книги (указана в начале кода в комментариях).
Перевел при помощи программы из Java (там же ссылка).
Добавил ссылки по теме. Сам разбирался первый раз с графами. Если кто-то из опытных программистов может посоветовать почитать по графам что-то еще полезное, буду благодарен!

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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
using System;
 
// Что стоит почитать по теме:
//http://en.wikipedia.org/wiki/Depth-first_search
//http://www.cse.ohio-state.edu/~gurari/course/cis680/cis680Ch14.html
//http://www.algolist.net/Algorithms/Graph/Undirected/Depth-first_search#cormen_book
//Book: Data Structures and Algorithms in Java by Robert Lafore (Author)
//"Java to C# converter" Copyright © 2007 - 2012 Tangible Software Solutions Inc.
 
namespace GraphInDepth
{
 
 
    class Program
    {
      
// Дальше в комментариях  материалы с разных сайтов 
# region Usefull_Source
   
  //     Visit(v);
     //     Mark(v);
     // for каждого ребра vw графа G do
     //  if вершина w непомечена 
     //      DepthFirstTraversal(G,w);
     //   end if; 
     //end for;
      
 
 
 
////            Обход графов в глубину
////    На этом шаге мы рассмотрим алгоритм обхода графа в глубину. 
 
////    Обход в глубину (называемый иногда стандартным обходом), есть обход графа по следующим правилам:
 
////находясь в вершине x, нужно двигаться в любую другую, ранее не посещенную вершину (если таковая найдется), одновременно запоминая дугу, 
//            по которой мы впервые попали в данную вершину;
////если из вершины x мы не можем попасть в ранее не посещенную вершину или таковой вообще нет, то мы возвращаемся в вершину z,
//            из которой впервые попали в x, и продолжаем обход в глубину из вершины z.
////    При выполнении обхода графа по этим правилам мы стремимся проникнуть "вглубь" графа так далеко, как это возможно,
//            затем отступаем на шаг назад и снова стремимся пройти вперед и так далее.
 
////    На этом шаге мы приведем рекурсивную функцию обхода графа в глубину. Граф представлен в памяти структурой Вирта.
 
 
            // В приведенной ниже формулировке нерекурсивного алгоритма поиска в глубину на графе [1,с.125-126] предполагается: 
            //во-первых, что зафиксирован некоторый линейный порядок на множестве всех вершин графа, и, во-вторых, что множество вершин, 
            //смежных со всякой вершиной графа, также линейно упорядочено.
 
            //while (Имеется хотя бы одна непосещенная вершина)
            //{
            //  Пусть p - первая из непосещенных вершин.
            //  Посетить вершину p и поместить ее в пустой стек S;
            //  while ( Стек S непуст )
            //  {
            //    Пусть p - вершина, находящаяся на верхушке стека S;
            //    if (У вершины p есть непосещенные смежные вершины)
            //      { Пусть q - первая непосещенная вершина из вершин, смежных 
            //        вершине p. Пройти по ребру (p,q), посетить вершину q и 
            //        поместить ее в стек S } 
            //    else Удалить вершину p из стека S
            //  }
            //}
 
 
 
#endregion
      
public class StackX
{
private readonly int SIZE = 20;
private int[] st;
private int top;
public StackX() // constructor
{
st = new int[SIZE]; // make array
top = -1;
}
public virtual void push(int j) // put item on stack
{
    st[++top] = j;
}
public virtual int pop() // take item off stack
{
    return st[top--];
}
public virtual int peek() // peek at top of stack
{
    return st[top];
}
public virtual bool Empty
{
    get
    {
        return (top == -1);
    }
}
} // end class StackX
////////////////////////////////////////////////////////////////
 
        
public class Vertex
{
public char label; // label (e.g. 'A')
public bool wasVisited;
// ------------------
public Vertex(char lab) // constructor
{
label = lab;
wasVisited = false;
}
// ------------------
} // end class Vertex
////////////////////////////////////////////////////////////////
 
               
public class Graph
{
private readonly int MAX_VERTS = 20;
private Vertex[] vertexList; // list of vertices
private int[][] adjMat; // adjacency matrix
private int nVerts; // current number of vertices
private StackX theStack;
// ------------------
public Graph() // constructor
{
vertexList = new Vertex[MAX_VERTS];
// adjacency matrix
//ORIGINAL LINE: adjMat = new int[MAX_VERTS][MAX_VERTS];
//JAVA TO C# CONVERTER NOTE: The following call to the 'RectangularArrays' helper class reproduces the rectangular array initialization that is automatic in Java:
adjMat = RectangularArrays.ReturnRectangularIntArray(MAX_VERTS, MAX_VERTS);
nVerts = 0;
for (int j = 0; j < MAX_VERTS; j++) // set adjacency
{
for (int k = 0; k < MAX_VERTS; k++) // matrix to 0
{
adjMat[j][k] = 0;
}
}
theStack = new StackX();
} // end constructor
// ------------------
public virtual void addVertex(char lab)
{
vertexList[nVerts++] = new Vertex(lab);
}
// ------------------
public virtual void addEdge(int start, int end)
{
adjMat[start][end] = 1;
adjMat[end][start] = 1;
}
// ------------------
public virtual void displayVertex(int v)
{
Console.Write(vertexList[v].label);
}
// ------------------
public virtual void dfs() // depth-first search
{ // begin at vertex 0
vertexList[0].wasVisited = true; // mark it
displayVertex(0); // display it
theStack.push(0); // push it
while (!theStack.Empty) // until stack empty,
{
// get an unvisited vertex adjacent to stack top
int v = getAdjUnvisitedVertex(theStack.peek());
if (v == -1) // if no such vertex,
{
theStack.pop();
}
else // if it exists,
{
vertexList[v].wasVisited = true; // mark it
displayVertex(v); // display it
theStack.push(v); // push it
}
} // end while
// stack is empty, so we're done
for (int j = 0; j < nVerts; j++) // reset flags
{
vertexList[j].wasVisited = false;
}
} // end dfs
// ------------------
// returns an unvisited vertex adj to v
public virtual int getAdjUnvisitedVertex(int v)
{
for (int j = 0; j < nVerts; j++)
{
if (adjMat[v][j] == 1 && vertexList[j].wasVisited == false)
{
return j;
}
}
return -1;
} // end getAdjUnvisitedVert()
// ------------------
 
} // end class Graph
////////////////////////////////////////////////////////////////
 
 
//----------------------------------------------------------------------------------------
//  Copyright © 2007 - 2012 Tangible Software Solutions Inc.
//  This class can be used by anyone provided that the copyright notice remains intact.
//
//  This class provides the logic to simulate Java rectangular arrays, which are jagged
//  arrays with inner arrays of the same length.
//----------------------------------------------------------------------------------------
 
internal static partial class RectangularArrays
{
    internal static int[][] ReturnRectangularIntArray(int Size1, int Size2)
    {
        int[][] Array = new int[Size1][];
        for (int Array1 = 0; Array1 < Size1; Array1++)
        {
            Array[Array1] = new int[Size2];
        }
        return Array;
    }
}
 
public static void Main(string[] args)
{
Graph theGraph = new Graph();
theGraph.addVertex('1'); // 0 (start for dfs)
theGraph.addVertex('2'); // 1
theGraph.addVertex('3'); // 2
theGraph.addVertex('4'); // 3
theGraph.addVertex('5'); // 4
theGraph.addEdge(0, 1); // 1-2
theGraph.addEdge(1, 4); // 2-5
theGraph.addEdge(4, 2); // 5-3
theGraph.addEdge(2, 3); // 3-4
Console.Write("Visits: ");
theGraph.dfs(); // depth-first search
Console.WriteLine();
    Console.ReadKey();
} // end main()
 
    }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
08.11.2012, 15:23
Помогаю со студенческими работами здесь

Из списка смежности в матрицу смежности. Выполнить обход графа глубину
Помогите пожалуйста с программой: Дан список смежности. Преобразовать в матрицу смежности. Выполнить обход графа в глубину. Заранее...

Неориентированный граф задан матрицей смежности. Найдите степени всех вершин графа
Работа с графами. Совсем не шарю в них. Может кто то поможет написать программу. Только с комментариями пожалуйста. Постановка задачи: ...

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

Реализация обхода графа в глубину (DFS)
Всем здравствуйте! Задача такова реализация обхода не взвешенного дерева, который задан матрицей смежности и поиск высоты дерева. ...

Постфиксный обход(в глубину, сверху-вниз) и удаление в двоичном бинарном дереве
Здравствуйте! Мне срочно нужна помощь... Мне нужно сделать удаление в двоичном дереве поиска и обход бинарного дерева в...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru