// GraphTea Project: http://github.com/graphtheorysoftware/GraphTea // Copyright (C) 2012 Graph Theory Software Foundation: http://GraphTheorySoftware.com // Copyright (C) 2008 Mathematical Science Department of Sharif University of Technology // Distributed under the terms of the GNU General Public License (GPL): http://www.gnu.org/licenses/ package graphtea.extensions.reports.matching; import graphtea.graph.graph.Edge; import graphtea.graph.graph.GraphModel; import graphtea.graph.graph.SubGraph; import graphtea.platform.lang.CommandAttitude; import graphtea.plugins.reports.extension.GraphReportExtension; import java.util.ArrayList; import java.util.List; import java.util.Vector; /** * @author Ali Rostami */ @CommandAttitude(name = "maxium_matching", abbreviation = "_max_match") public class MaxMatchingExtension implements GraphReportExtension { public String getName() { return "Maximum Matching"; } public String getDescription() { return "Maximum Matching"; } public Object calculate(GraphModel gg) { SubGraph sg = new SubGraph(); List<Integer>[] g = new List[gg.getVerticesCount()]; for (int i = 0; i < gg.getVerticesCount(); i++) { g[i] = new ArrayList(); } for(Edge e : gg.getEdges()) { g[e.source.getId()].add(e.target.getId()); } MaximumMatching.maxMatching(g); int[] match = MaximumMatching.match; for(int i=0;i<match.length;i++) { if(match[i]>=0) { sg.vertices.add(gg.getVertex(i)); sg.vertices.add(gg.getVertex(match[i])); } } for(int i=0;i<match.length;i++) { if(match[i] >= 0) sg.edges.add(gg.getEdge( gg.getVertex(i), gg.getVertex(match[i]))); } Vector<Object> ret = new Vector<>(); ret.add("Number of Matching:" + sg.edges.size()); ret.add(sg); return ret; } @Override public String getCategory() { return "Matching"; } }