public class Graph {
private final int V;
private int Lines;
private ArrayList<ArrayList<Integer>> table;
public Graph(int v) {
V = v;
Lines=0;
table= new ArrayList<ArrayList<Integer>>();
for (int i = 0; i <v ; i++) {
table.add(new ArrayList<Integer>());
}
}
public int getV() {
return V;
}
public int getLines() {
return Lines;
}
public void addEdge(int m,int n){
table.get(m).add(n);
table.get(n).add(m);
Lines++;
}
public ArrayList<Integer> RelatedV(int v){
return table.get(v);
}
}
public class DepthFirst {
public boolean[] marked;
private int count;
public DepthFirst(Graph G,int goal){
marked = new boolean[G.getV()];
count=0;
df(G, goal);
}
private void df(Graph G,int goal){
marked[goal]=true;
for (Integer m: G.RelatedV(goal)) {
if (marked[m]==false){
df(G, m);
}
}
count++;
}
public boolean marked(int x){
return marked[x];
}
public int getCount() {
return count;
}
}
public class WidthFirst {
boolean[] marked;
int count;
LinkedList<Integer> waitSearch;
public WidthFirst(Graph g,int goal){
marked=new boolean[g.getV()];
count=0;
waitSearch=new LinkedList<Integer>();
WidthFirstSearch(g, goal);
}
public void WidthFirstSearch(Graph g,int flag){
waitSearch.addLast(flag);
while (!waitSearch.isEmpty()){
Integer first = waitSearch.removeFirst();
if (marked[first]==false){
marked[first]=true;
count++;
}
ArrayList<Integer> list = g.RelatedV(first);
for (int i = 0; i <list.size() ; i++) {
Integer content = list.get(i);
if (marked[content]==false){
waitSearch.addLast(content);
}
}
}
}
public boolean remarked(int x){
return marked[x];
}
}