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);
        }