Tarjan: Difference between revisions

From Rosetta Code
Content added Content deleted
No edit summary
No edit summary
Line 40: Line 40:


Action<Node> StrongConnect = null;
Action<Node> StrongConnect = null;
StrongConnect = v =>
StrongConnect = (v) =>
{
{
// Set the depth index for v to the smallest unused index
// Set the depth index for v to the smallest unused index

Revision as of 18:03, 5 February 2017

Task
Tarjan
You are encouraged to solve this task according to the task description, using any language you may know.
This page uses content from Wikipedia. The original article was at Graph. The list of authors can be seen in the page history. As with Rosetta Code, the text of Wikipedia is available under the GNU FDL. (See links for details on variance)


Tarjan's algorithm is an algorithm in graph theory for finding the strongly connected components of a graph. It runs in linear time, matching the time bound for alternative methods including Kosaraju's algorithm and the path-based strong component algorithm. Tarjan's Algorithm is named for its discoverer, Robert Tarjan.

References

C#

<lang csharp>using System; using System.Collections.Generic;

class Node { public int LowLink { get; set; } public int Index { get; set; } public int N { get; }

public Node(int n) { N = n; Index = -1; LowLink = 0; } }

class Graph { public HashSet<Node> V { get; } public Dictionary<Node, HashSet<Node>> Adj { get; }

/// <summary> /// Tarjan's strongly connected components algorithm /// </summary> public void Tarjan() { var index = 0; // number of nodes var S = new Stack<Node>();

Action<Node> StrongConnect = null; StrongConnect = (v) => { // Set the depth index for v to the smallest unused index v.Index = index; v.LowLink = index;

index++; S.Push(v);

// Consider successors of v foreach (var w in Adj[v]) if (w.Index < 0) { // Successor w has not yet been visited; recurse on it StrongConnect(w); v.LowLink = Math.Min(v.LowLink, w.LowLink); } else if (S.Contains(w)) // Successor w is in stack S and hence in the current SCC v.LowLink = Math.Min(v.LowLink, w.Index);

// If v is a root node, pop the stack and generate an SCC if (v.LowLink == v.Index) { Console.Write("SCC: ");

Node w; do { w = S.Pop(); Console.Write(w.N + " "); } while (w != v);

Console.WriteLine(""); } };

foreach (var v in V) if (v.Index < 0) StrongConnect(v); } }</lang>