private uint _maxDepth; // Максимальное значение вложенности узла /// <summary> /// Конструктор для построения цепочек из городов /// </summary> /// <param name="towns">Массив городов</param> public WordTree(string[] towns) { Towns = towns; Parallel.ForEach(Towns, town => // Строим корневые узлы { var townSet = new HashSet <string>(Towns); Node <string> rootTownNode = new TownNode(town, townSet); lock (_rootTownSet) { _rootTownSet.Add(rootTownNode); } rootTownNode.BuidTownTree(); }); foreach (var rootNode in _rootTownSet) // Находим максимальное значение вложенности { FindMaximumDepth(rootNode); } foreach (var rootNode in _rootTownSet) // Находим узлы с максимальными цепочками { FindMaximumNodes(rootNode); } foreach (var maxNode in _maxLeafs) // Строим максимальные цепочки городов { _tempChain.Clear(); GenerateMaxChains(maxNode); _tempChain.AddLast(maxNode.Town); _maxChains.Add(new LinkedList <string>(_tempChain)); } foreach (var chainList in _maxChains) // Оставляем только уникальные { var strBuilder = new StringBuilder(); foreach (string town in chainList) { strBuilder.Append(town).Append(" "); } _uniqueChains.Add(strBuilder.ToString()); } }
public override void BuidTownTree() { if (Variants.Count <= 0) { return; } foreach (string variant in Variants) { if (char.ToLower(Town[Town.Length - 1]) != char.ToLower(variant[0]) || Town.Equals(variant)) { continue; } var restVariants = new HashSet <string>(Variants); restVariants.Remove(Town); var townNode = new TownNode(variant, restVariants, this) { Depth = Depth + 1 }; Matches.Add(townNode); townNode.BuidTownTree(); } }