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