void FillMaximalMatching(BipartiteGraphMatching <T> matching) { GetMaximalMatchingFSet fSet = new GetMaximalMatchingFSet(Data.VSize); do { fSet.Clear(); var freeUVertexList = Data.GetUVertexList().Where(x => !IsMatchedVertex(x)); foreach (var uVertex in freeUVertexList) { Color bfsColor = Color.CreateColor(); DoBFSearch(uVertex, (x, y) => IsMatchedEdge(x, y) ? Data.IsVVertex(x) : Data.IsUVertex(x) , (x, y) => Data.UpdateEdgeData(x, y, edgeData => edgeData.WithColor(bfsColor)) , x => { if (Data.IsVVertex(x) && !IsMatchedVertex(x)) { if (IsInFSet(x)) { fSet.UpdateItem(x.GetData <GetMaximalMatchingVertexInFSetData>().ItemIndex, new GetMaximalMatchingFSetItem(x, bfsColor)); } else { int itemIndex = fSet.AddItem(new GetMaximalMatchingFSetItem(x, bfsColor)); x.Data = new GetMaximalMatchingVertexInFSetData(itemIndex); } return(false); } return(true); }); } foreach (var fSetItem in fSet) { DoDFSearch(fSetItem.Vertex, (x, y) => Data.GetEdgeData(x, y).Color == fSetItem.BfsColor , (x, y) => { var uVertex = matching.Data.GetUVertex(Data.GetUVertex(x, y).Handle); var vVertex = matching.Data.GetVVertex(Data.GetVVertex(x, y).Handle); if (IsMatchedEdge(x, y)) { Data.GetEdgeData(x, y).WithData(null); matching.DeleteEdge(uVertex, vVertex); } else { Data.UpdateEdgeData(x, y, edgeData => edgeData.WithData(new GetMaximalMatchingMatchedData())); matching.CreateEdge(uVertex, vVertex); } }, x => { bool stopSearch = Data.IsUVertex(x) && !IsMatchedVertex(x); x.Data = new GetMaximalMatchingMatchedData(); return(stopSearch ? false : true); }); } }while(fSet.Size != 0); ClearData(true, true); }