package com.interview.graph;
import java.util.HashMap;
import java.util.Map;
public class EulerianPathAndCircuit<T> {
public enum Eulerian{
NOT_EULERIAN,
EULERIAN,
SEMIEULERIAN
}
private boolean isConnected(Graph<T> graph){
Vertex<T> startVertex = null;
for(Vertex<T> vertex : graph.getAllVertex()){
if(vertex.getDegree() != 0){
startVertex = vertex;
break;
}
}
if(startVertex == null){
return true;
}
Map<Vertex<T>,Boolean> visited = new HashMap<Vertex<T>, Boolean>();
DFS(startVertex,visited);
for(Vertex<T> testVertex : graph.getAllVertex()){
if(testVertex.getDegree()!= 0 && !visited.containsKey(testVertex)){
return false;
}
}
return true;
}
private void DFS(Vertex<T> startVertex, Map<Vertex<T>, Boolean> visited){
visited.put(startVertex, true);
for(Vertex<T> child : startVertex.getAdjacentVertexes()){
if(!visited.containsKey(child)){
DFS(child,visited);
}
}
}
public Eulerian isEulerian(Graph<T> graph){
if(!isConnected(graph)){
return Eulerian.NOT_EULERIAN;
}
int odd = 0;
for(Vertex<T> vertex : graph.getAllVertex()){
if(vertex.getDegree()!=0 && vertex.getDegree() % 2 != 0){
odd++;
}
}
if(odd > 2){
return Eulerian.NOT_EULERIAN;
}
return odd == 0 ? Eulerian.EULERIAN : Eulerian.SEMIEULERIAN;
}
public static void main(String args[]){
Graph<Integer> graph = new Graph<Integer>(false);
graph.addSingleVertex(1);
graph.addSingleVertex(2);
graph.addSingleVertex(3);
graph.addEdge(4, 5);
graph.addEdge(6, 4);
graph.addEdge(5,6);
EulerianPathAndCircuit<Integer> eulerian = new EulerianPathAndCircuit<Integer>();
Eulerian result = eulerian.isEulerian(graph);
System.out.print(result);
}
}