Алгоритм обхода полного графа через все вершины не повторяясь, с указной вершины
У нас есть полный граф, не обязательно проходить через все рёбра, нужно пройти все вершины без повторений. Как это можно реализовать на c# ? есть такой код, но при количестве вершин равным 4 и выше зависает
> введите количество вершин 3
> введите начала вершины 1
> 1 лишнее
> 1-2 лишние
> 1-2-3
> 1-3 лишнее
> 1-3-2
код программы на c#
using System;
using System.Collections.Generic;
namespace ConsoleApp5
{
class Edge
{
public int u, v;
public Edge(int u, int v)
{
this.u = u;
this.v = v;
}
}
/* думаю как создать карту и расположить вершины графа, так что бы между ними было расстояние минимум 6 метров, и можно было менять их положение случаи чего
class Map
{
Point point = new Point(1,1);
public Xmax,Ymax, colPrep;
public Map(int Xmax=100, int Ymax=100, int colPrep=5)
{
int x,y;
Random r = new Random();
for (int i = 0; i <= 5; i++)
{
x = r.Next(1, Xmax);
y = r.Next(1, Ymax);
}
}
}*/
class Program
{
static bool Find(List<int> list, int x)
{
if (list == null) return false;
else
{
foreach(var i in list)
{
if (i == x) return true;
}
}
return false;
}
static bool Compare(List<int> L1,List<int> L2)
{
if (L1.Count == L2.Count)
{
for (var i = 0; i < L1.Count; i++)
if (L1[i] != L2[i]) return false;
}
else return false;
return true;
}
static void AddWay(List<int> list, List<List<int>> listWays)
{
int i = 0;
bool temp = true;
while (i<listWays.Count&&temp)
{
if (Compare(list, listWays[i])) temp = false;
else i++;
}
if (temp || i == listWays.Count)
{
listWays.Add(new List<int>());
foreach (var j in list)
{
listWays[listWays.Count - 1].Add(j);
}
}
}
static void Ways(List<Edge> edges, int numberEdge, List<int> list,List<List<int>> listWays)
{
foreach(var edge in edges)
{
if(!Find(list,numberEdge))
{
if (edge.u==numberEdge)
{
list.Add(numberEdge);
if (!Find(list, edge.v)) Ways(edges, edge.v, list,listWays);
else AddWay(list,listWays);
list.Remove(numberEdge);
}
else if (edge.v==numberEdge)
{
list.Add(numberEdge);
if (!Find(list, edge.u)) Ways(edges, edge.u, list, listWays);
else AddWay(list,listWays);
list.Remove(numberEdge);
}
}
}
}
static void Print(List<int> list)
{
for (var i=0;i<list.Count;i++)
{
if (i != list.Count - 1) Console.Write($"{list[i]}-");
else Console.Write(list[i]);
}
Console.WriteLine();
}
static void Main(string[] args)
{
List<Edge> edges = new List<Edge>();
List<List<int>> listWays = new List<List<int>>();
Console.WriteLine("введите количество вершин ");
int colVer = int.Parse(Console.ReadLine());
if(colVer<3)
{
Console.WriteLine("так не работает один путь ");
}
int n=colVer*((colVer-1)/2);
for (int i=1; i<=n; i++)
{
for(int j = 1; j<=n; j++)
{
edges.Add(new Edge(i,j));
}
}
/*edges.Add(new Edge(0,1));
edges.Add(new Edge(0,2));
edges.Add(new Edge(1,0));
edges.Add(new Edge(2,0));*/
Console.WriteLine("введите начала вершины ");
int start = int.Parse(Console.ReadLine());
Ways(edges, start, new List<int>(),listWays);
foreach (var i in listWays) Print(i);
Console.ReadLine();
}
}
}