package com.interview.books.question300;
import com.interview.leetcode.utils.GraphNode;
import java.util.*;
/**
* Created_By: stefanie
* Date: 14-12-16
* Time: 下午3:29
*/
public class TQ36_BipartiteGraphChecker {
public boolean canBiPartite(GraphNode node) {
HashSet<GraphNode> oddLayer = new HashSet<>();
HashSet<GraphNode> evenLayer = new HashSet<>();
Queue<GraphNode> queue = new LinkedList<>();
if(node != null) queue.add(node);
int layer = 0;
while(!queue.isEmpty()){
int layerSize = queue.size();
HashSet<GraphNode> sameLayer = layer % 2 == 0? evenLayer : oddLayer;
HashSet<GraphNode> oppLayer = layer % 2 == 0? oddLayer : evenLayer;
for(int i = 0; i < layerSize; i++){
GraphNode current = queue.poll();
if(sameLayer.contains(current)) continue;
if(oppLayer.contains(current)) return false;
sameLayer.add(current);
for(GraphNode neighbor : current.neighbors){
if(sameLayer.contains(neighbor)) return false;
queue.add(neighbor);
}
}
layer++;
}
return true;
}
public static void main(String[] args){
TQ36_BipartiteGraphChecker checker = new TQ36_BipartiteGraphChecker();
List<GraphNode> nodes = GraphNode.sampleDirectedGraph();
System.out.println(checker.canBiPartite(nodes.get(1)));
nodes = new ArrayList<>();
for(int i = 0; i < 6; i++){
nodes.add(new GraphNode(i));
}
nodes.get(1).neighbors.add(nodes.get(2));
nodes.get(2).neighbors.add(nodes.get(5));
nodes.get(2).neighbors.add(nodes.get(3));
nodes.get(3).neighbors.add(nodes.get(4));
nodes.get(4).neighbors.add(nodes.get(5));
nodes.get(5).neighbors.add(nodes.get(4));
System.out.println(checker.canBiPartite(nodes.get(1)));
}
}