package algo;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.PriorityQueue;
import java.util.Queue;
public class DepthFirstSearch {
public ArrayList<Vertex> arr;
public static int NUM_VERICES = 7;
public DepthFirstSearch(ArrayList<Vertex> arr) {
this.arr = arr;
}
void topsort(LinkedList<Vertex> linkedList) throws Exception {
for (int counter = 0; counter < NUM_VERICES; counter++) {
Vertex v = findNewVertexOfIndegreeZero();
System.out.println(v.topNum);
if (v == null)
return ;
// v.topNum = counter;
if (v.adject != null)
for (Vertex ver : v.adject)
--ver.indegree;
linkedList.add(v);
}
}
Vertex findNewVertexOfIndegreeZero() {
for (int i = 0; i < arr.size(); i++) {
if (arr.get(i) != null && !arr.get(i).known && arr.get(i).indegree == 0) {
arr.get(i).known = true;
return arr.get(i);
}
continue;
}
return null;
}
private static class Vertex {
boolean known;
int topNum;
LinkedList<Vertex> adject;
int indegree;
public Vertex(int topNum) {
this.topNum = topNum;
}
public LinkedList<Vertex> getAdject() {
return adject;
}
public void setAdject(Vertex adject) {
if (this.adject == null)
this.adject = new LinkedList<Vertex>();
this.adject.add(adject);
adject.indegree++;
}
}
public static void main(String[] args) throws Exception {
LinkedList<Vertex> linkedList = new LinkedList<Vertex>();
ArrayList<Vertex> arrayList = new ArrayList<Vertex>();
Vertex vertex1 = new Vertex(1);
Vertex vertex2 = new Vertex(2);
Vertex vertex3 = new Vertex(3);
Vertex vertex4 = new Vertex(4);
Vertex vertex5 = new Vertex(5);
Vertex vertex6 = new Vertex(6);
Vertex vertex7 = new Vertex(7);
vertex1.setAdject(vertex2);
vertex1.setAdject(vertex3);
vertex1.setAdject(vertex4);
vertex2.setAdject(vertex4);
vertex2.setAdject(vertex5);
vertex3.setAdject(vertex6);
vertex4.setAdject(vertex3);
vertex4.setAdject(vertex6);
vertex4.setAdject(vertex7);
vertex5.setAdject(vertex4);
vertex5.setAdject(vertex7);
vertex7.setAdject(vertex6);
arrayList.add(vertex1);
arrayList.add(vertex2);
arrayList.add(vertex3);
arrayList.add(vertex4);
arrayList.add(vertex5);
arrayList.add(vertex6);
arrayList.add(vertex7);
DepthFirstSearch depthFirstSearch = new DepthFirstSearch(arrayList);
depthFirstSearch.topsort(linkedList);
System.out.println(linkedList.toString());
}
}