Как я могу найти все циклы в неориентированном графе?
Здравствуйте, не мог бы кто-нибудь помочь мне найти решение для поиска всех циклов в неориентированном графе.
Я работаю с C# VS 2017, ASP.Net 5.2.60618,0
Танки так много для вашей помощи.
НОГА.
Что я уже пробовал:
Я искал в Google и найти предложение решения, но theare много ошибок в моем VS C# IDE. вот копия. Я не знаю, как исправить свои ошибки.
Спасибо снова.
пространство имен akCyclesInUndirectedGraphs
{
классная программа
{
// График, смоделированный как список ребер
статический int[,] graph =
{
{1, 2}, {1, 3}, {1, 4}, {2, 3},
{3, 4}, {2, 6}, {4, 6}, {7, 8},
{8, 9}, {9, 7}
};
статический список<int[]> cycles = новый список<int[]>();
// статический пустота главный(строка[] аргументы)
// {
для (тип int я = 0; Я &л; график.Метода getlength может служить метод(0); я++)
for (int j = 0; j < graph.GetLength(1); j++)
{
findNewCycles(new int[] {graph[i, j]});
}
foreach (int[] cy в циклах)
{
строка s = "" + cy[0];
for (int i = 1; i < cy.Длина; i++)
s += "," + cy[i];
Приставка.WriteLine(s);
}
// }
static void findNewCycles(int[] path)
{
int n = путь[0];
int x;
int[] sub = новый int[путь.Длина + 1];
для (тип int я = 0; Я &л; график.Метода getlength может служить метод(0); я++)
for (int y = 0; y <= 1; y++)
если (график[i, y] == n)
// edge ссылается на наш текущий узел
{
x = график[i, (y + 1) % 2];
if (!visited(x, path))
// соседний узел еще не на пути
{
sub[0] = x;
Массив.Copy(path, 0, sub, 1, path.Длина);
// исследуйте расширенный путь
findNewCycles(суб);
}
еще если ((путь.Длина > 2) && (x == path[путь.Длина - 1]))
// цикл найден
{
int[] p = нормализовать(путь);
int[] inv = invert(p);
если (жизнью(р) и усилитель; & жизнью(инв))
циклы.Добавить(p);
}
}
}
статический bool равен(int[] a, int[] b)
{
боол рэт = (а[0] == б[0]) и усилитель; & (а.Длина == б.Длина);
для (тип int я = 1; рет &усилитель;& (я &л; а.Длина); я++)
если (a[i] != b[i])
{
ret = false;
}
вернуться в отставке;
}
static int[] invert(int[] path)
{
int[] p = новый int[путь.Длина];
for (int i = 0; i < path.Длина; i++)
p[i] = path[путь.Длина - 1 - я];
возвращение нормализации(Р);
}
// поверните путь цикла таким образом, чтобы он начинался с наименьшего узла
static int[] normalize(int[] path)
{
int[] p = новый int[путь.Длина];
int x = наименьший(путь);
int n;
Массив.Copy(path, 0, p, 0, path.Длина);
в то время как (p[0] != x)
{
n = p[0];
Массив.Копия(П 1, П 0, п.Длина - 1);
p[p.Length - 1] = n;
}
возвращение п;
}
static bool isNew(int[] path)
{
bool ret = true;
foreach(int[] p в циклах)
Если (равно(p, путь))
{
ret = false;
перерыв;
}
вернуться в отставке;
}
static int наименьший(int[] путь)
{
int min = путь[0];
foreach (int p in path)
если (p < min)
min = p;
возврат мин;
}
static bool visited(int n, int[] path)
{
bool ret = false;
foreach (int p in path)
если (p == n)
{
рэт = истина;
перерыв;
}
вернуться в отставке;
}
}
}
//
//Циклы для демонстрационного графика:
//
//
//1,3,2
//1,4,3,2
//1,4,6,2
//1,3,4,6,2
//1,4,6,2,3
//1,4,3
//2,6,4,3
//7,9,8
Member 14053198
( // ) В // static void Main(string[] args) и ( // } в Main () close предназначены только для тестирования...
Patrice T
Воспользуйся Улучшить вопрос чтобы обновить ваш вопрос.
Чтобы каждый мог обратить внимание на эту информацию.
Member 14053198
Большое спасибо Патрис.
К счастью, я нашел ошибку. Я забыл скопировать "с помощью SystemCollections.Общий;" Я копирую это, и все ошибки пропадают. ошибочно я предполагаю, что мой C# VS 2017 позаботится о нем.
Сегодня все работает нормально.
Спасибо, что уделили мне время.
Лучшие Регарады
НОГА
Patrice T
Разместите это как решение и примите его, просто чтобы сказать, что вопрос решен и закрыть его.
Patrice T
Попробуйте перечислить сообщения об ошибках и позиции.
BillWoodruff
Опишите ошибки, и где они происходят. Прокомментируйте свой код.
Member 14053198
Большое спасибо Биллу Вудраффу.
К счастью, я нашел ошибку. Я забыл скопировать "с помощью SystemCollections.Общий;" Я копирую это, и все ошибки пропадают. ошибочно я предполагаю, что мой C# VS 2017 позаботится о нем.
Сегодня все работает нормально.
Спасибо, что уделили мне время.
Лучшие Регарады
НОГА