private async void TarjanStartBtn_Click(object sender, EventArgs e) { var errorMessage = "\n1. Linia - lista wierzchołków oddzielona znakiem ';'\n" + "2. Linia - numer wierzchołka dla którego rozpoczynamy szukanie\n" + "3. Linia - lista par wierzchołków, dla których szukamy przodka, np. 1-2;3-4;4-5" + "Kolejne linie w pliku powinny zawierać dane:\nWierzhołek;Dziecko;Dziecko..."; var someException = false; var model = new TarjanModel(); var tree = new TarjanTreeModel(); var targetPairs = new List <TarjanVertexPairTarget>(); var fileName = TarjanSourceFileTb.Text; if (string.IsNullOrEmpty(fileName)) { MessageBox.Show("Brak pliku z którego mam pobrać dane"); return; } try { var lines = File.ReadAllLines(fileName); if (lines.Length < 3) { throw new Exception("Plik ma nie wystarczającą liczbę linii.\n" + errorMessage); } // all vertices, first line var verticesFromLines = lines[0].Split(';'); foreach (var vertexFromLine in verticesFromLines) { var vertexName = Int32.Parse(vertexFromLine); tree.Vertices.Add(new TarjanNodeModel { Color = Color.White, Count = 1, Name = vertexName, }); } // second line, root tree.Root = tree.Vertices.Find(x => x.Name == Int32.Parse(lines[1])); // third line, target vertex pairs var pairsFromLines = lines[2].Split(';'); foreach (var pairs in pairsFromLines) { var pairVertices = pairs.Split('-'); var pairVertex1 = tree.Vertices.Find(v => v.Name == Int32.Parse(pairVertices[0])); var pairVertex2 = tree.Vertices.Find(v => v.Name == Int32.Parse(pairVertices[1])); targetPairs.Add(new TarjanVertexPairTarget { Vertex1 = pairVertex1, Vertex2 = pairVertex2 }); } // graph for (int iLines = 3; iLines < lines.Length; iLines++) { var vertices = lines[iLines].Split(';'); var tarjanVertex = tree.Vertices.Where(x => x.Name == Int32.Parse(vertices[0])).FirstOrDefault(); if (tarjanVertex == default(TarjanNodeModel)) { throw new Exception("Nie istnieje taki vertex w podanych wierzchołkach"); } else { for (int iVertex = 1; iVertex < vertices.Length; iVertex++) { var neighVertexName = Int32.Parse(vertices[iVertex]); var neighVertex = tree.Vertices.Where(x => x.Name == neighVertexName).FirstOrDefault(); if (neighVertex == default(TarjanNodeModel)) { throw new Exception("Nie istnieje taki vertex jako sąsiad w podanych wierzchołkach"); } else { tarjanVertex.Children.Add(neighVertex); } } } } } catch (Exception ex) { var content = ex.Message; content += errorMessage; MessageBox.Show(content); someException = true; } if (!someException) { model.Tree = tree; model.Target = targetPairs; await StartAlgorithm(new TarjanProblem(model)); } TarjanSourceFileTb.Text = ""; }
public TarjanProblem(TarjanModel model) { _stopwatch = new Stopwatch(); _tree = model.Tree; _target = model.Target; }