package com.interview.graph;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* http://www.geeksforgeeks.org/maximum-bipartite-matching/
*/
public class MaximumBiparteMatching {
public int findMaxMatching(Map<Integer,List<Integer>> jobApplications, List<Integer> allJobs){
Map<Integer,Integer> match = new HashMap<Integer,Integer>();
int maxMatch = 0;
for(Integer candidate : jobApplications.keySet()){
Set<Integer> jobsSeen = new HashSet<Integer>();
maxMatch += matchJobs(candidate, jobApplications, match, jobsSeen) ==true ? 1 : 0;
}
return maxMatch;
}
private boolean matchJobs(Integer candidate, Map<Integer,List<Integer>> jobApplications,Map<Integer,Integer> match,Set<Integer> jobsSeen){
for(int job : jobApplications.get(candidate)){
if(jobsSeen.contains(job)){
continue;
}
jobsSeen.add(job);
if(match.get(job) == null){
match.put(job, candidate);
return true;
}
boolean flag = matchJobs(match.get(job),jobApplications,match,jobsSeen);
if(flag){
match.put(job, candidate);
return true;
}
}
return false;
}
public static void main(String args[]){
List<Integer> app0 = new ArrayList<Integer>();
app0.add(10);
app0.add(11);
app0.add(13);
List<Integer> app1 = new ArrayList<Integer>();
app1.add(10);
List<Integer> app2 = new ArrayList<Integer>();
app2.add(12);
List<Integer> app3 = new ArrayList<Integer>();
app3.add(12);
app3.add(10);
app3.add(11);
Map<Integer,List<Integer>> jobApplications = new HashMap<Integer,List<Integer>>();
jobApplications.put(0, app0);
jobApplications.put(1, app1);
jobApplications.put(2, app2);
jobApplications.put(3, app3);
MaximumBiparteMatching mbm = new MaximumBiparteMatching();
List<Integer> allJobs = new ArrayList<Integer>();
allJobs.add(10);
allJobs.add(11);
allJobs.add(12);
allJobs.add(13);
System.out.print(mbm.findMaxMatching(jobApplications, allJobs));
}
}