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); } }
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); } }