Example #1
0
        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);
            }
        }