コード例 #1
0
ファイル: Tarjan.cs プロジェクト: Atljh0987/Graphs
        private static void Passer(IUnweightedGraph graph, int v, State[] states, UnmanagedNumbersArray sorted, ref int sortedCount)
        {
            if (states[v] == State.Checked)
            {
                return;
            }
            if (states[v] == State.Checking)
            {
                throw new ArgumentException("Cycle in graph");
            }

            states[v] = State.Checking;

            foreach (var arc in graph.InComingArcs(v))
            {
                Passer(graph, arc, states, sorted, ref sortedCount);
            }

            sorted[sortedCount++] = v;
            states[v]             = State.Checked;
        }
コード例 #2
0
ファイル: Tarjan.cs プロジェクト: Atljh0987/Graphs
        public static int[] Run(IUnweightedGraph graph)
        {
            if (graph == null)
            {
                throw new ArgumentNullException("graph");
            }
            if (!graph.Oriented)
            {
                throw new ArgumentException("Graph must be oriented");
            }

            using (UnmanagedNumbersArray SortedElements = new UnmanagedNumbersArray(graph.PeakCount))
            {
                State[] states      = new State[graph.PeakCount];
                int     sortedCount = 0;

                for (int i = 0; i < graph.PeakCount; i++)
                {
                    Passer(graph, i, states, SortedElements, ref sortedCount); // переизучить что тако ref
                }

                return(SortedElements.ToArray());
            }
        }