package com.interview.graph; import java.util.Collection; import java.util.Comparator; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import java.util.TreeMap; import java.util.TreeSet; /** http://www.geeksforgeeks.org/graph-coloring-set-2-greedy-algorithm/ */ public class GraphColoring { public void WelshPowell(){ Graph<Integer> graph = new Graph<Integer>(false); graph.addEdge(1, 2); graph.addEdge(2, 3); graph.addEdge(1, 4); graph.addEdge(4, 6); graph.addEdge(1, 7); graph.addEdge(1, 8); graph.addEdge(2, 9); graph.addEdge(1, 3); graph.addEdge(3, 4); graph.addEdge(2,4); graph.addEdge(3, 7); graph.addEdge(2, 7); ComparatorVertex c = new ComparatorVertex(); Set<Vertex<Integer>> sortedSet = new TreeSet<Vertex<Integer>>(c); for(Vertex<Integer> v : graph.getAllVertex()){ sortedSet.add(v); } Map<Long,String> assignedColor = new HashMap<Long,String>(); Map<Long,String> finalAssignedColor = new HashMap<Long,String>(); Map<String,Boolean> colorsUsed = new TreeMap<String,Boolean>(); colorsUsed.put("Green", false); colorsUsed.put("Blue", false); colorsUsed.put("Red", false); colorsUsed.put("Yellow", false); colorsUsed.put("Orange",false); Set<Vertex<Integer>> removeSet = new HashSet<Vertex<Integer>>(); while(sortedSet.size() != removeSet.size()){ String color = null ; for(Vertex<Integer> v : sortedSet){ if(removeSet.contains(v)){ continue; } boolean allUncolored = allAdjacentUnColored(v.getAdjacentVertexes(),assignedColor); if(allUncolored){ color = getUnusedColor(colorsUsed); assignedColor.put(v.getId(), color); removeSet.add(v); finalAssignedColor.put(v.getId(), color); } } colorsUsed.remove(color); assignedColor.clear(); } System.out.println(finalAssignedColor); } public void colorGraph(){ Graph<Integer> graph = new Graph<Integer>(false); graph.addEdge(1, 2); graph.addEdge(2, 3); graph.addEdge(1, 4); graph.addEdge(4, 6); graph.addEdge(1, 7); graph.addEdge(1, 8); graph.addEdge(2, 9); graph.addEdge(1, 3); graph.addEdge(3, 4); graph.addEdge(2,4); graph.addEdge(3,7); Map<String,Boolean> colorsUsed = new HashMap<String,Boolean>(); colorsUsed.put("Green", false); colorsUsed.put("Blue", false); colorsUsed.put("Red", false); colorsUsed.put("Yellow", false); Map<Long,String> colorsAssigned = new HashMap<Long,String>(); Collection<Vertex<Integer>> allVertex = graph.getAllVertex(); for(Vertex<Integer> v : allVertex){ List<Vertex<Integer>> adjacentVertexes = v.getAdjacentVertexes(); for(Vertex<Integer> adjacentVertex : adjacentVertexes){ String color = colorsAssigned.get(adjacentVertex.getId()); if(color != null){ assignColor(color,colorsUsed); } } String color = getUnusedColor(colorsUsed); colorsAssigned.put(v.getId(), color); resetColor(colorsUsed); } System.out.println(colorsAssigned); } private String getUnusedColor(Map<String,Boolean> colorsUsed){ for(String color : colorsUsed.keySet()){ if(colorsUsed.get(color).equals(false)){ return color; } } throw new RuntimeException(); } private void resetColor(Map<String,Boolean> colorsUsed){ Set<String> colors = new HashSet<String>(); for(String color : colorsUsed.keySet()){ colors.add(color); } for(String color : colors){ colorsUsed.remove(color); colorsUsed.put(color, false); } } private void assignColor(String color, Map<String,Boolean> colorsUsed){ colorsUsed.remove(color); colorsUsed.put(color, true); } private boolean allAdjacentUnColored(Collection<Vertex<Integer>> vertexes, Map<Long,String> colorsAssigned){ for(Vertex<Integer> vertex : vertexes){ if(colorsAssigned.containsKey(vertex.getId())){ return false; } } return true; } public static void main(String args[]){ GraphColoring graphColoring = new GraphColoring(); graphColoring.WelshPowell(); } } class ComparatorVertex implements Comparator<Vertex<Integer>>{ @Override public int compare(Vertex<Integer> o1, Vertex<Integer> o2) { if(o1.getDegree() <= o2.getDegree()){ return 1; }else{ return -1; } } }