package com.interview.algorithms.graph;
import com.interview.basics.model.graph.searcher.BFSearcher;
import com.interview.basics.model.graph.Graph;
import com.interview.basics.model.graph.searcher.Processor;
public class C6_8_BiPartiteGraphBFS extends C6_8_BiPartiteGraph {
public boolean isBiPartite = true;
public C6_8_BiPartiteGraphBFS(Graph g) {
super(g);
searcher = new BFSearcher(g){
private boolean flag = true;
@Override
public void bfsInner(Processor p) {
while(!queue.isEmpty()){
int s = queue.poll();
if(s == -1){
flag = !flag;
if(!queue.isEmpty()) queue.add(-1);
continue;
}
if(marked[s]) {
if(flags[s] != flag) {
isBiPartite = false;
return;
} else {
continue;
}
}
flags[s] = flag;
marked[s] = true;
if(g.adj[s] != null){
for(int t : g.adj[s]){
if(marked[t]) {
if(flags[t] == flag) {
isBiPartite = false;
return;
} else {
continue;
}
}
queue.add(t);
}
}
}
}
@Override
public void search(int s, Processor p) {
queue.add(s);
queue.add(-1);
bfsInner(p);
}
};
}
@Override
public boolean isBiPartite() {
return isBiPartite;
}
}