Как сделать обход в ширину и поиск компонент связности через матрицу смежности?
У меня вершины графа являются объектами класса Vertex. Нужно реализовать обход в ширину и поиск компонент связности через матрицу смежности matrix. Имеющийся код ничего не выводит в консоль, в чем проблема?
public void DFS(ref int?[,] matrix, Vertex s)
{
int k = Vertexes.IndexOf(s);
mark[k] = true;
for (int i = 0; i < Vertexes.Count; ++i)
{
int nxt = (int)matrix[k,i];
if (!mark[nxt])
{
DFS(ref matrix, nxt);
}
}
}
public void BFS(ref int?[,] matrix, Vertex s) //обход в ширину
{
bool[] mark = new bool[Vertexes.Count];
int p = Vertexes.IndexOf(s);
Queue<int> Q = new Queue<int>();
Q.Enqueue(p);
mark[p] = true;
while (Q.Count > 0)
{
int u = Q.Dequeue();
for (int i = 0; i < Vertexes.Count; ++i)
{
if (matrix[u, i] == 1 && !mark[i])
{
mark[i] = true;
Q.Enqueue(i);
}
}
}
}
public int connectedbfs(ref int?[,] matrix)
{
int cnt = 0;
bool[] mark = new bool[Vertexes.Count];
while (true)
{
foreach (Vertex v in Vertexes)
{
int m = Vertexes.IndexOf(v);
if (!mark[m])
{
BFS(ref matrix, v);
++cnt;
}
}
return cnt;
}
}
Ответы (1 шт):
Автор решения: MBo
→ Ссылка
Массивов mark два, и оба локальные.
В connectedbfs свой массив проверяется, но никогда не помечается.
А всё, что случается в BFS - там же и остаётся. Ну почти как в бойцовском клубе...
Должен быть один общий (глобальный) массив.