Работа с неориентированным графом - C#
Формулировка задачи:
Есть неориентированный граф 4х4, нужно составить алгоритм, который бы находил пути в которых принимают участие все элементы графа. Граф представлен в виде матрицы смежности.
Например есть массив 4Х4
0 1 1 0
1 0 1 1
1 1 0 1
0 1 1 0
То есть каждый элемент графа имеет прямую связь с другим, кроме первого и четвертого. И программа должна вывести пути, в которых принимают участие все элементы графа, следовательно для этого массива программа выведет
1, 2, 3, 4
1, 3, 2, 4
2, 1, 3, 4
3, 1, 2, 4
Программа не должна работать только с этой матрицей смежности.
Решение задачи: «Работа с неориентированным графом»
textual
Листинг программы
private static void Main()
{
int[,] matrix =
{
{ 0, 1, 1, 0 },
{ 1, 0, 1, 1 },
{ 1, 1, 0, 1 },
{ 0, 1, 1, 0 }
};
int[] indexes = Enumerable.Range(0, matrix.GetLength(0)).ToArray();
do
{
var valid = true;
for (var i = 1; i < indexes.Length; i++)
if (matrix[indexes[i - 1], indexes[i]] == 0)
{
valid = false;
break;
}
if (valid)
Console.WriteLine(string.Join(" ", indexes.Select(x => x + 1)));
}
while (Generate(indexes));
}
private static bool Generate(IList<int> array)
{
int j = array.Count - 2;
while (j != -1 && array[j] >= array[j + 1]) j--;
if (j == -1) return false;
int k = array.Count - 1;
while (array[j] >= array[k]) k--;
Swap(array, j, k);
int l = j + 1, r = array.Count - 1;
while (l < r) Swap(array, l++, r--);
return true;
}
private static void Swap(IList<int> array, int i, int j)
{
int temp = array[i];
array[i] = array[j];
array[j] = temp;
}