/// <summary> /// Получить дополнительные пути из заданной точки. /// </summary> /// <param name="Start">Начальная вершина.</param> /// <param name="Curent_way">Список пройденных путей.</param> /// <param name="Curent_point">Текущая вершина.</param> /// <returns></returns> List <List <Track> > Cycle(Vertex Start, List <Track> Curent_way, Vertex Curent_point) { ///Если пришли в стартавую точку отдаем путь. if (Curent_point == Start) { return new List <List <Track> >() { Curent_way } } ; ///Если пришли в ту точку в которой были, то дальше не продолжаем. if (Curent_way.Any((a) => a.begin == Curent_point)) { return(null); } else { ///Тут храним пути из этой точки. var wayFromPoint = new List <List <Track> >(); ///Запускаем рекурсию на все пути из вершины. foreach (var a in Curent_point.OutWay) { var newWay = Curent_way.ToList(); newWay.Add(a); var Way = Cycle(Start, newWay, a.end); if (Way != null) { wayFromPoint.AddRange(Way); } } return(wayFromPoint); } } /// <summary> /// Удаление дублированных циклов. /// </summary> List <List <Track> > RemoveEqiul(List <List <Track> > IN) { List <List <Track> > OUT = IN.ToList(); for (int i = 0; i < IN.Count; i++) { for (var j = i + 1; j < IN.Count; j++) { if (eqiul(IN[i], IN[j])) { OUT.Remove(IN[j]); } } } return(OUT); } /// <summary> /// Сравнение двух путей (циклов) на эквивалентность. /// </summary> bool eqiul(List <Track> T1, List <Track> T2) { foreach (var a in T1) { if (!T2.Any(b => b == a)) { return(false); } } return(true); }