import java.util.ArrayList;
import java.util.Stack;
public class GraphDFSnr
{//从顶点v开始,进行非递归的深度优先遍历
private Graph G;
private boolean [] visited;
private ArrayList<Integer> order=new ArrayList<>();//用来存储先序深度优先遍历结果的链表
private void dfs(int v)
{
Stack<Integer>stack=new Stack();
//首先将v压入栈,同时,要记录visited[i]尾true
stack.push(v);
visited[v]=true;
//只要堆栈不为空,说明还有未被遍历的节点
while(!stack.empty())
{
//访问栈顶元素
int cur=stack.pop();
order.add(cur);
//对于图,和cur相邻的顶点有多个需要这个循环
for(int w:G.adj(cur))
{
//每一次遍历到一个和cur相邻的顶点w,不要忘记判断一下w是否已经被访问过了
if(!visited[w])
{
//如果w没有被访问过,将w压入栈中,等待后续的访问
stack.push(w);
//不要忘记维护visited,让visited[w]=true
visited[w]=true;
}
}
}
}
public GraphDFSnr(Graph G)
{
this.G=G;
visited=new boolean[G.V()];
for(int v=0;v<G.V();v++)
{
if(!visited[v])
dfs(v);
}
}
public Iterable<Integer>order()//返回一个可遍历的对象,先序遍历结果
{
return order;
}
public static void main(String[] args)//测试函数
{
Graph g=new Graph("g.txt");
GraphDFSnr graphDFS=new GraphDFSnr(g);
System.out.println(graphDFS.order());//七个顶点六条边,共计两个连通分量
}
}
程序中所使用到的图文件如下
7 7
0 1
0 2
1 3
1 4
2 3
2 6
5 6