void Dfs1(Node node) { node.Index = nextSCCIndex++; node.LowLink = node.Index; nodeStack.Push (node); foreach (var to in node.PointsTo) { if (to.Index == 0) { Dfs1 (to); node.LowLink = System.Math.Min (node.LowLink, to.LowLink); } else if (nodeStack.Contains (to)) { node.LowLink = System.Math.Min (node.LowLink, to.Index); } } if (node.LowLink == node.Index) { NodeGroup g = new NodeGroup (); Node n; do { n = nodeStack.Pop (); n.Group = g; g.Add (n); } while (n != node); groups.Add (g); } }