using GraphCustomSearcher.Data; namespace GraphCustomSearcher; public class Graph { public List Verticls; public List Edges; public string Path { get; set; } public Verticle Target { get; set; } public Graph() { Verticls = new List(); Edges = new List(); } /// /// Загрузка узлов /// /// узлы public void AddVerticle(List verticles) { Verticls.AddRange(verticles); } /// /// Загрузка рёбер /// /// рёбра public void AddEdge(List edges) { Edges.AddRange(edges); } public void RebuildEdge() { Path = string.Empty; foreach (var edge in Edges) { edge.VerticleStop.IsVisited = false; edge.VerticleStart.IsVisited = false; } } /// /// Перебор рёбер - поиск вершин в которые входит точка старта /// /// /// public void SearchPath(string source, string target) { Console.WriteLine($"Начало: {source} Конец: {target}"); var sourceVerticle = new Verticle(source); var targetVerticle = new Verticle(target); foreach (var edge in Edges) { var state_1 = edge.VerticleStart.Name == sourceVerticle.Name && edge.VerticleStart.IsVisited == sourceVerticle.IsVisited; var state_2 = !edge.VerticleStart.IsVisited; var state_3 = !(!string.IsNullOrEmpty(Path) && Path.Contains(edge.VerticleStop.Name)); if (state_1 && state_2 && state_3) { Path += edge.VerticleStart.Name + " "; Console.WriteLine($"Ребро {edge.VerticleStart.Name} направляется в {edge.VerticleStop.Name}"); edge.VerticleStart.IsVisited = true; Target = edge.VerticleStop; if (targetVerticle.Name == edge.VerticleStop.Name) { Path += edge.VerticleStop.Name; return; } SearchPath(edge.VerticleStop.Name, targetVerticle.Name); } } } }