2. 无向图的DFS算法:按照教材中的定义方式,完整实现图的DFS算法,给定图数据文件(tinyG.txt),能够输出DFS的节点遍历结果,及每个节点的Pre和Post值,和连通分量的个数与节点构成。类名:GraphDFS。博文标题:第四周作业——无向图的DFS算法
package GraphRepresentation;
public class GraphDFS {
private Node[] visited; //存放遍历的结果。
private int t; //存放连通分量的个数。
private int[][] matrix; //图的邻接矩阵。
private int k; //用于设置Pre和Post的值。
public GraphDFS(int[][] matrix){
t=0;
k=1;
visited=new Node[matrix.length];
this.matrix=matrix;
for(int i=0;i<visited.length;i++){
visited[i]=new Node();
visited[i].setExit(1);
}
}
//获取图的DFS遍历结果
public Node[] getNode(){
return this.visited;
}
//进行一次DFS深度优先遍历。
public void oneDFS(int i){
visited[i].setVisited(1);
visited[i].setPre(k);
k++;
for(int j=0;j<visited.length;j++){
if(matrix[i][j]==1&&visited[j].getVisited()!=1){
oneDFS(j);
}
}
visited[i].setPost(k);
k++;
}
//进行所有节点的DFS深度优先遍历
public void DFS(){
for(int x=0;x<visited.length;x++){
if(visited[x].getVisited()==0){
oneDFS(x);
t++;
}
}
k--;
}
//获取连通分量的个数。
public int getConnect(){
return this.t;
}
}
package GraphRepresentation;
public class Node {
private int Pre;
private int Post;
private int visited;
private int exit;
public Node(){
this.Pre=0;
this.Post=0;
this.visited=0; //0代表没有被访问过;1代表被访问过。
this.exit=0; //0代表该节点存在,1代表该节点不存在。
}
public int getPre(){
return Pre;
}
public void setPre(int pre){
this.Pre=pre;
}
public int getPost(){
return this.Post;
}
public void setPost(int post){
this.Post=post;
}
public int getVisited(){
return this.visited;
}
public void setVisited(int visited){
this.visited=visited;
}
public int getExit(){
return this.exit;
}
public void setExit(int exit){
this.exit=exit;
}
}