Поиск циклов между двумя вершинами в графе
Делаю алгоритм краскала, но для него нужен поиск циклов
#include <iostream>
#include <vector>
#include <algorithm>
void dfs(int v, int u);
int main()
{
const int N = 10;
int smezh[N][N] = //таблица смежности с весом ребер
{
{0,10,0,0,20,0,0,15,0,0},
{10,0,5,0,0,0,0,2,8,9},
{0,5,0,16,0,0,0,0,4,0},
{0,0,16,0,28,25,0,0,11,9},
{20,0,0,28,0,15,0,0,0,0},
{0,0,0,25,15,0,10,0,7,5},
{0,0,0,0,0,10,0,11,0,3},
{15,2,0,0,0,0,11,0,4,14},
{0,8,4,11,0,7,0,4,0,0},
{0,9,0,9,0,5,3,14,0,0}
};
int arr[N][N]{}, vershx[N]{}, vershy[N]{}, sum = 0;
int min = INT_MAX;
std::vector<int> minn;
for (int i = 0; i < N; i++) {
for (int j = i; j < N; j++) {
if (smezh[i][j] > 0) {
min = smezh[i][j];
minn.push_back(min);
}
}
}
sort(minn.begin(), minn.end()); //сортировка ребер по возрастанию
for (int z = 0; z < minn.size(); z++) {
for (int i = 0; i < N; i++) {
for (int j = i; j < N; j++) {
if (minn[z] == smezh[i][j] && dfs(i,j) && dfs(j,i)) { //находит ребро и проверяет наличие циклов между 2 вершинами
sum += minn[z];
std::cout << i << " - " << j << " Weight: " << minn[z] << ". Interim amount: " << sum << std::endl;
}
}
}
}
return 0;
}
void dfs(int v, int u) //в интернете пишут, что нужно воспользоваться поиском в глубину,
//но из-за отсутствия комментариев ничего непонятно
{
int white = 0;
int grey = 1;
int black = 2;
static int color[N]{};
color[v] = grey;
if (color[u] == white)
dfs(u);
if (color[u] == grey)
return 0;
color[v] = black;
return 1;
}