import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Scanner;
import java.util.Stack;
public class Traversal_test {
public Vertex dfs[];
public Vertex bfs[];
public void dfs(Graph graph) {
dfs = new Vertex[graph.listVertex.length];
Stack<Vertex> dfs_stack = new Stack<Vertex>();
dfs_stack.push(graph.listVertex[0]);
graph.listVertex[0].isVisited = true;
int index = 0;
dfs[0] = graph.listVertex[0];
while (!dfs_stack.isEmpty()) {
Vertex v = getAdjVertex(dfs_stack.peek());
if (v == null) {
dfs_stack.pop();
} else {
dfs[++index] = v;
v.isVisited = true;
dfs_stack.push(v);
}
}
}
public void bfs(Graph graph) {
int num = graph.listVertex.length;
bfs = new Vertex[num];
ArrayDeque<Vertex> queue = new ArrayDeque<Vertex>();
bfs[0] = graph.listVertex[0];
queue.add(graph.listVertex[0]);
graph.listVertex[0].isVisited = true;
Vertex vv;
int index = 0;
while (!queue.isEmpty()) {
Vertex v = queue.remove();
while ((vv = getAdjVertex(v)) != null) {
queue.add(vv);
bfs[++index] = vv;
vv.isVisited = true;
}
}
}
public static Vertex getAdjVertex(Vertex v) {
ArrayList<Vertex> alv = v.getAdj();
if (alv != null) {
for (int k = 0; k < alv.size(); k++) {
if (alv.get(k).isVisited == false) {
return alv.get(k);
}
}
}
return null;
}
public static void main(String[] args) {
System.out.println("Input the number of vertex:");
Scanner scan = new Scanner(System.in);
int node_num = scan.nextInt();
System.out.println("Is this directed graph?");
boolean flag = scan.nextBoolean();
Graph graph = new Graph(node_num, flag);
for (int k = 0; k < node_num; k++) {
graph.listVertex[k] = new Vertex(k);
}
System.out.println("Input the each node of each edge:-1 to exit");
int i = 0, j = 0;
while ((i = scan.nextInt()) != -1) {
j = scan.nextInt();
graph.addEdge(i, j);
}
Traversal_test dt = new Traversal_test();
dt.dfs(graph);
if (dt.dfs.length < graph.listVertex.length) {
System.out.println("The graph is not a connected path!");
} else {
System.out.println("The depth-first traversal of this graph is:");
for (int k = 0; k < dt.dfs.length; k++) {
System.out.println(dt.dfs[k].toString());
}
}
for (int k = 0; k < node_num; k++) {
graph.listVertex[k].isVisited = false;
}
dt.bfs(graph);
if (dt.bfs.length < graph.listVertex.length) {
System.out.println("The graph is not a connected path!");
} else {
System.out.println("The breadth-first traversal of this graph is:");
for (int k = 0; k < dt.bfs.length; k++) {
System.out.println(dt.bfs[k].toString());
}
}
scan.close();
}
}