コード例 #1
0
        private void Tarjan(TarjanNodeModel vertex)
        {
            MakeSet(vertex);

            vertex.Ancestor = vertex;

            foreach (var child in vertex.Children)
            {
                Tarjan(child);
                Union(vertex, child);
                Find(vertex).Ancestor = vertex;
            }

            vertex.Color = Color.Black;

            var targetPairs = _target.Where(x => x.Vertex1.Name == vertex.Name || x.Vertex2.Name == vertex.Name).ToList();

            foreach (var pair in targetPairs)
            {
                var v = pair.Vertex1 == vertex ? pair.Vertex2 : pair.Vertex1;

                if (v.Color == Color.Black)
                {
                    var ancestor = Find(v).Ancestor.Name;
                    _result += $"({vertex.Name},{v.Name}) -> {ancestor}\n";
                }
            }
        }
コード例 #2
0
        private void Union(TarjanNodeModel vertex1, TarjanNodeModel vertex2)
        {
            TarjanNodeModel largeRoot, smallRoot, vertexSmall, vertexLarge;

            if (vertex1.Root.Count > vertex2.Root.Count)
            {
                largeRoot   = vertex1.Root;
                vertexLarge = vertex1;

                smallRoot   = vertex2.Root;
                vertexSmall = vertex2;
            }
            else
            {
                largeRoot   = vertex2.Root;
                vertexLarge = vertex2;

                smallRoot   = vertex1.Root;
                vertexSmall = vertex1;
            }

            smallRoot.Father = largeRoot;
            largeRoot.Count  = largeRoot.Count + smallRoot.Count;
            smallRoot        = largeRoot;
        }
コード例 #3
0
        // return ancestor
        private TarjanNodeModel Find(TarjanNodeModel vertex)
        {
            var list          = new List <TarjanNodeModel>();
            var currentVertex = vertex;

            while (currentVertex.Father != null)
            {
                list.Add(currentVertex);
                currentVertex = currentVertex.Father;
            }

            list.ForEach(v => v.Father = currentVertex);

            return(currentVertex);
        }
コード例 #4
0
 private void MakeSet(TarjanNodeModel vertex)
 {
     vertex.Father = null;
     vertex.Count  = 1;
 }