import java.io.File; import java.io.FileInputStream; import java.io.InputStreamReader; import java.io.Reader; public class GraphDFS { public static int V=0,E=0; public static void Graph(String fileName){ File file = new File(fileName); Reader reader = null; try { reader = new InputStreamReader(new FileInputStream(file)); int tempchar; tempchar = reader.read(); while(tempchar!=10){ V=V*10+(tempchar-48); tempchar = reader.read(); }//读取v的值,遇到回车字符时结束 tempchar = reader.read();//读取下一个字符 while(tempchar!=10){ E=E*10+(tempchar-48); tempchar = reader.read(); }//读取v的值,遇到回车字符时结束 //************************* int arc[][]=new int[V][V]; int lin[]=new int[2*E]; for(int i=0;i<V;i++) for(int j=0;j<V;j++) arc[i][j]=0; //建立矩阵数组,同时初始化为0 int v1=0,v2=0,y=0,y2=0,t=0; while((tempchar = reader.read())!=-1) { if(tempchar>=48 && tempchar<=57) { y=y*10+(tempchar-48); y2=1; } if(tempchar<48 && y2==1)//当读取的字符不是数字且已读取一个顶点的值 { lin[t]=y;y=0;t++; } } reader.close(); for(int i=0;i<2*E;i++){ v1=lin[i]; v2=lin[++i]; arc[v1][v2]=1; arc[v2][v1]=1; } graphDFS(arc); }catch (Exception e) { e.printStackTrace(); } }//读取txt文件并生成对应的邻接矩阵 public static int time=1; public static void graphDFS(int arc[][]){ int visited[]=new int[V]; int Pre[]=new int[V]; int Post[]=new int[V]; for(int i=0;i<V;i++){ visited[i]=0; Pre[i]=0; Post[i]=0; } for(int v=0;v<V;v++){ if(visited[v]==0) //如果v还未被访问,就执行DFS()算法 DFS(arc,visited,Pre,Post,v); } for(int i=0;i<V;i++) //输出顶点V与对应的pre值和post值 System.out.println(" V= "+i+" pre: "+Pre[i]+" post: "+Post[i]); } public static void DFS(int arc[][],int visited[],int Pre[],int Post[],int v){ visited[v]=1; Pre[v]=time; for(int w=0;w<V;w++){ if(visited[w]==0 && arc[v][w]==1){ time=time+1; DFS(arc,visited,Pre,Post,w); } } time=time+1; Post[v]=time; } public static void main(String[] agrs){ Graph("tinyG.txt"); } }
![第四周算法概论作业——无向图的DFS算法 第四周算法概论作业——无向图的DFS算法](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9nby8%3D.jpg?w=700&webp=1)