using System.Collections.Generic;
private int[,] adjMatrix;
public Graph(int vertices)
adjMatrix = new int[vertices, vertices];
public void AddEdge(int source, int destination)
adjMatrix[source, destination] = 1;
adjMatrix[destination, source] = 1;
public static HashSet<Tuple<int, int>> Bridges(Graph graph)
var visited = new HashSet<int>();
var bridges = new HashSet<Tuple<int, int>>();
var ids = new Dictionary<int, int>();
var lowLinkValues = new Dictionary<int, int>();
for (int i = 0; i < graph.AdjMatrix.GetLength(0); i++)
Dfs(i, parent, id, bridges, ids, lowLinkValues, visited, graph.AdjMatrix);
HashSet<Tuple<int, int>> bridges,
Dictionary<int, int> ids,
Dictionary<int, int> lowLinkValues,
lowLinkValues.Add(vertex, id);
for (int i = 0; i < adjMatrix.GetLength(0); i++)
if (!visited.Contains(i))
Dfs(i, parent, id, bridges, ids, lowLinkValues, visited, adjMatrix);
if (ids[vertex] < lowLinkValues[i])
bridges.Add(Tuple.Create(vertex, i));
lowLinkValues[vertex] = Math.Min(lowLinkValues[vertex], lowLinkValues[i]);
lowLinkValues[vertex] = Math.Min(lowLinkValues[vertex], ids[i]);
public static void Main()
var bridges = Bridges(g);
foreach (var bridge in bridges)
Console.WriteLine(bridge.Item1);
Console.WriteLine(bridge.Item2);