public int[] GetPath(Node x) { var vs = new SList <int>(); Expose(x); var stack = new Stack <(Node cur, bool right)>(); stack.Push((x, true)); while (stack.Count > 0) { var(cur, right) = stack.Pop(); if (cur == null) { continue; } if (right) { Push(cur); stack.Push((cur, false)); stack.Push((cur.Right, true)); } else { vs.Add(cur.Index); stack.Push((cur.Left, true)); } } return(vs.ToArray()); }
/// <summary> /// <para><paramref name="to"/>: 頂点 i からの遷移先。負数は遷移先なしとする。</para> /// <para><paramref name="start"/>: どの頂点からのパスを見るか</para> /// <para>制約: <paramref name="to"/>[i] < |<paramref name="to"/>|, 0 ≦ <paramref name="start"/> < |<paramref name="to"/>|</para> /// <para>計算量: O(N)</para> /// </summary> /// <param name="to">数値 i からの遷移先</param> /// <param name="start">どの頂点からのパスを見るか</param> public PathLoop(int[] to, int start) { var used = new int[to.Length]; var list = new SList <int>(to.Length); int cur = start; while (used[cur] == 0) { list.Add(cur); used[cur] = list.Count; cur = to[cur]; if ((uint)cur >= (uint)to.Length) { Straight = list.ToArray(); Loop = Array.Empty <int>(); return; } } var ix = used[cur] - 1; Straight = list.AsSpan()[..ix].ToArray();