import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.PriorityQueue;
import java.util.Queue;
class FindTraingle {
public static final int BIG_NEGATIVE = -999;
public static void main
(String[] args
) { int noOfNodes=6;
List<Edge> grpahEdges = new ArrayList<Edge>();
grpahEdges.add(new Edge(0, 1,BIG_NEGATIVE));
grpahEdges.add(new Edge(0, 3,BIG_NEGATIVE));
//grpahEdges.add(new Edge(0, 4,BIG_NEGATIVE));
grpahEdges.add(new Edge(1, 2,BIG_NEGATIVE));
grpahEdges.add(new Edge(2, 3,BIG_NEGATIVE));
grpahEdges.add(new Edge(3, 4,BIG_NEGATIVE));
grpahEdges.add(new Edge(2, 4,BIG_NEGATIVE));
findTriangle(5,grpahEdges);
for(Edge e:grpahEdges){
e.weight=BIG_NEGATIVE;
}
findOneLevelTriangle(5,grpahEdges);
}
public static boolean findTriangle(int noOfNodes, List<Edge> grpahEdges){
// e.weight ==0 not yet visited.
int [] distance = new int[noOfNodes];
for(int i=0;i<noOfNodes;i++){
distance[i]=BIG_NEGATIVE;
}
Queue<Integer> q = new PriorityQueue<Integer>();
q.add(0);
distance[0]=0;
while(q.peek()!=null){
int currentNode = q.poll();
if(findTriangleUtil(currentNode,grpahEdges,distance,q)){
System.
out.
println("Big Traingle found"); return true;
}
}
return false;
}
public static boolean findTriangleUtil(int currentNode, List<Edge> grpahEdges,int [] distance,Queue q){
Edge e ;
do{
e = getUnVisitedLinkForThisNode(currentNode,grpahEdges);
if(e!=null){
e.weight=1; // mark it as visited
int nextNode;
if(e.sourcevertex == currentNode){
nextNode = e.destinationvertex;
}else{
nextNode = e.sourcevertex;
}
if(distance[nextNode]== distance[currentNode] ){
// Triangle is formed
return true;
}else{
// update distance
distance[nextNode] = distance[currentNode] +1;
q.add(nextNode);
}
}
}while(e!=null);
return false;
}
public static Edge getUnVisitedLinkForThisNode(int currentNode,List<Edge> grpahEdges){
for(Edge e :grpahEdges){
if((e.sourcevertex==currentNode || e.destinationvertex ==currentNode ) && e.weight ==BIG_NEGATIVE){
return e;
}
}
return null;
}
public static ArrayList<Edge> getListOfLinks(int currentNode,List<Edge> grpahEdges){
ArrayList<Edge> returnList = new ArrayList<Edge>();
for(Edge e :grpahEdges){
if((e.sourcevertex==currentNode || e.destinationvertex ==currentNode ) && e.weight ==BIG_NEGATIVE){
returnList.add(e);
}
}
return returnList;
}
public static boolean findOneLevelTriangle(int noOfNodes, List<Edge> grpahEdges){
// For each node find its children
// Then for each children check if it connects to any of its siblings
for(int i=0;i<noOfNodes;i++){
Edge e ;
do{
e = getUnVisitedLinkForThisNode(i,grpahEdges);
if(e!=null){
e.weight=1; // mark it as visited
int nextNode;
if(e.sourcevertex == i){
nextNode = e.destinationvertex;
}else{
nextNode = e.sourcevertex;
}
children.
put(nextNode,
Boolean.
TRUE); }
}while(e!=null);
// Queue is ready with sibling. Now get edges for each siblings
for(int j: children.keySet()){
for(Edge childEdge : getListOfLinks(j,grpahEdges)){
int nextNode;
if(childEdge.sourcevertex == j){
nextNode = childEdge.destinationvertex;
}else{
nextNode = childEdge.sourcevertex;
}
if(children.get(nextNode) != null){
System.
out.
println("Connecting to siblngs. It is a triangle"); return true;
}
}
}
}
return false;
}
}
class Edge implements Comparable<Edge>
{
public int sourcevertex;
public int destinationvertex;
public int weight;
@Override
public int compareTo(Edge edge2) {
if (this.weight < edge2.weight)
return -1;
if (this.weight > edge2.weight)
return 1;
return 0;
}
public Edge(){
}
public Edge(int sourcevertex, int destinationvertex) {
super();
this.sourcevertex = sourcevertex;
this.destinationvertex = destinationvertex;
}
public Edge(int sourcevertex, int destinationvertex, int weight) {
super();
this.sourcevertex = sourcevertex;
this.destinationvertex = destinationvertex;
this.weight = weight;
}
}