public static HashSet <Edge> GetBiggestMatching(this Bigraph graph) { var matching = new HashSet <Edge>(); while (true) { var chain = graph.GetInterchangingChain(matching); if (chain == null) { return(matching); } var chainSet = GetEdgesFromChain(chain); matching.SymmetricExceptWith(chainSet); graph.DarkNodes.Add(chain[0]); graph.DarkNodes.Add(chain[chain.Count - 1]); } }