Найти кратчайший цикл на графике

У меня проблема с поиском циклов в графе. В условии мы должны найти кратчайший цикл в ориентированном графе.

Мой график (A, B, C, D) и связи (дуги) между элементами:

(A-> B), (A-> A), (B-> C), (B-> A), (C-> D), (C-> A), (D-> A)

и так циклы следующие:

А-> B-> C-> D-> А; A-> B-> C-> A; А-> В-> А; А-> а.

Программа должна распечатать кратчайший цикл, то есть A-> A. Чтобы решить ее, мне нужно сначала найти все циклы, затем поместить их каждый в отдельный список и, наконец, принести наименьший список, который будет самым коротким циклом (A-> A), но я не знаю, как это реализовать. На данный момент я сделал связи (дуги) между элементами.

Это мой код:

#include <iostream>

using namespace std;

const int N = 10;

struct elem
{
char key;
elem *next;
} *g1[N];

void init(elem *g[N])
{
for (int i = 0; i < N; i++)
g[i] = NULL;
}

int search_node(char c, elem *g[N])
{
for (int i = 0; i < N; i++)
if (g[i])
if (g[i]->key == c)
{
return 1;
}

return 0;
}

int search_arc(char from, char to, elem *g[N])
{
if (search_node(from, g) && search_node(to, g))
{
int i = 0;

while (g[i]->key != from) i++;

elem *p = g[i]->next;

while (true)
{
if (p == NULL)
{
break;
}

if (p->key == to)
{
return 1;
}

p = p->next;
}
}

return 0;
}

void add_node(char c, elem *g[N])
{
if (search_node(c, g))
cout << "Node already exists.\n";

int i = 0;
while (g[i] && (i < N)) i++;

if (g[i] == NULL)
{
g[i] = new elem;
g[i]->key = c;
g[i]->next = NULL;
}
else
{
cout << "Maximum nodes reached.\n";
}
}

void add_arc(char from, char to, elem *g[N])
{
if (search_arc(from, to, g))
cout << "Arc already exists.\n";
else
{
if (!search_node(from, g))
add_node(from, g);

if (!search_node(to, g))
add_node(to, g);

int i = 0;
while (g[i]->key != from) i++;

elem *p = new elem;
p->key = to;
p->next = g[i]->next;

g[i]->next = p;
}
}

void print(elem *g[N])
{
for (int i = 0; i < N; i++)
{
if (g[i] != NULL)
{
elem *p = g[i];

while (p)
{
cout << p->key << "\t";
p = p->next;
}

cout << endl;
}
}
}void iscycle(elem *g[N])
{

}

int main()
{
system ("cls");

cout << "init: " << endl;
init(g1);

cout << "graph 1: " << endl;
add_arc('a', 'b', g1);
add_arc('a', 'a', g1);
add_arc('b', 'c', g1);
add_arc('b', 'a', g1);
add_arc('c', 'a', g1);
add_arc('c', 'd', g1);
add_arc('d', 'a', g1);

print(g1);

cout << "cycles: ";
iscycle(g1);

system("pause");
return 0;

}

Это мой пример графического изображения: график

-3

Решение

Если вы ищете полный ответ, тогда просто проверьте другие ответы — есть тонны вопросов, касающихся используемых алгоритмов, и я также нашел ответ с кодом, портированным на множество различных языков программирования (также имеется версия Cpp)

Объяснение алгоритма
Версия C ++

Однако я настоятельно рекомендую вам взглянуть на алгоритмы и реализовать их здесь без удаления уже написанного кода. Гораздо лучше написать это самому, чем просто копировать прошлое — вы узнаете намного больше;)

Если вам нужна более точная помощь, напишите свой текущий статус & посмотрим.

0

Другие решения


По вопросам рекламы [email protected]