package com.interview.algorithms.graph;
import com.interview.basics.model.graph.generic.AdjListGraph;
import com.interview.basics.model.graph.generic.Graph;
import com.interview.basics.model.graph.generic.Vertex;
import java.util.HashMap;
import java.util.Map;
/**
* Problem: Is a graph bipartite?
* @author chenting
*
*/
public class C6_8_BiPartiteGenericGraph {
public static final Integer UNVISITED = 0;
private Map<Vertex, Integer> flag = new HashMap<Vertex, Integer>();
public boolean bipartite(Graph g){
boolean isSuccess = true;
for(Vertex vertex : g.vertexs()){
if(flag.get(vertex) == null){
isSuccess = isSuccess && dfs(g, vertex, 1);
if(!isSuccess) return isSuccess;
}
}
return true;
}
public boolean dfs(Graph g, Vertex v, int previousFlag){
int currentFlag = 0;
if(previousFlag == 1){
currentFlag = 2;
} else {
currentFlag = 1;
}
flag.put(v, currentFlag);
for(Vertex w: g.adj(v)){
if(flag.get(w) == null){
dfs(g, w, currentFlag);
} else if(flag.get(w) != previousFlag){
return false;
}
}
return true;
}
public static void main(String[] args){
Graph g = new AdjListGraph(Graph.UNDIRECTED);
g.type = Graph.UNDIRECTED;
g.addEdge(new Vertex(0), new Vertex(1));
g.addEdge(new Vertex(0), new Vertex(5));
g.addEdge(new Vertex(1), new Vertex(3));
g.addEdge(new Vertex(2), new Vertex(3));
g.addEdge(new Vertex(6), new Vertex(4));
g.addEdge(new Vertex(4), new Vertex(5));
g.addEdge(new Vertex(2), new Vertex(4));
g.addEdge(new Vertex(0), new Vertex(2));
g.addEdge(new Vertex(0), new Vertex(6));
C6_8_BiPartiteGenericGraph biGraph = new C6_8_BiPartiteGenericGraph();
boolean isBiPartition = biGraph.bipartite(g);
System.out.println("Is Bi-Partition?\t" + isBiPartition);
for(Map.Entry<Vertex, Integer> item : biGraph.flag.entrySet()){
System.out.println(item.getKey().getValue() + "\t" + item.getValue());
}
}
}