예제 #1
0
        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 = "";
        }
예제 #2
0
 public TarjanProblem(TarjanModel model)
 {
     _stopwatch = new Stopwatch();
     _tree      = model.Tree;
     _target    = model.Target;
 }