/// <summary>
        /// Returns a list of Max BiPartite Match Edges
        /// </summary>
        /// <param name="graph"></param>
        /// <returns></returns>
        public List <MatchEdge <T> > GetMaxBiPartiteMatching(Graph <T> graph)
        {
            //check if the graph is BiPartite by coloring 2 colors
            var mColorer    = new MColorer <T, int>();
            var colorResult = mColorer.Color(graph, new int[] { 1, 2 });

            if (colorResult.CanColor == false)
            {
                throw new Exception("Graph is not BiPartite.");
            }

            return(getMaxBiPartiteMatching(graph, colorResult.Partitions));
        }
        /// <summary>
        /// Returns a list of Max BiPartite Match Edges.
        /// </summary>
        public List <MatchEdge <T> > GetMaxBiPartiteMatching(IGraph <T> graph)
        {
            if (this.@operator == null)
            {
                throw new ArgumentException("Provide an operator implementation for generic type T during initialization.");
            }

            //check if the graph is BiPartite by coloring 2 colors
            var mColorer    = new MColorer <T, int>();
            var colorResult = mColorer.Color(graph, new int[] { 1, 2 });

            if (colorResult.CanColor == false)
            {
                throw new Exception("Graph is not BiPartite.");
            }

            return(getMaxBiPartiteMatching(graph, colorResult.Partitions));
        }