Beispiel #1
0
        private void Run(AbstractTarjanNode node)
        {
            node.dfs     = this.maxdfs;
            node.LowLink = this.maxdfs;
            this.maxdfs++;
            this.stack.Push(node);
            node.OnStack = true;
            this.nodes.Remove(node);
            foreach (var neighbor in node.Neighbors)
            {
                if (this.nodes.Contains(neighbor))
                {
                    this.Run(neighbor);
                    node.LowLink = Math.Min(node.LowLink, neighbor.LowLink);
                }
                else if (neighbor.OnStack)
                {
                    node.LowLink = Math.Min(node.LowLink, neighbor.dfs);
                }
            }

            if (node.LowLink == node.dfs)
            {
                var s = new List <AbstractTarjanNode>();
                this.ResultSets.Add(s);
                AbstractTarjanNode n;
                do
                {
                    n         = this.stack.Pop();
                    n.OnStack = false;
                    s.Add(n);
                } while (node != n);
            }
        }
Beispiel #2
0
        private void Run(AbstractTarjanNode node) {
            node.dfs = this.maxdfs;
            node.LowLink = this.maxdfs;
            this.maxdfs++;
            this.stack.Push(node);
            node.OnStack = true;
            this.nodes.Remove(node);
            foreach (var neighbor in node.Neighbors) {
                if (this.nodes.Contains(neighbor)) {
                    this.Run(neighbor);
                    node.LowLink = Math.Min(node.LowLink, neighbor.LowLink);
                } else if (neighbor.OnStack) {
                    node.LowLink = Math.Min(node.LowLink, neighbor.dfs);
                }
            }

            if (node.LowLink == node.dfs) {
                var s = new List<AbstractTarjanNode>();
                this.ResultSets.Add(s);
                AbstractTarjanNode n;
                do {
                    n = this.stack.Pop();
                    n.OnStack = false;
                    s.Add(n);
                } while (node != n);
            }
        }