第四周作业——无向图的DFS算法

来源:互联网 发布:sigma.js 示例 编辑:程序博客网 时间:2024/04/28 17:31

2.无向图的DFS算法:按照教材中的定义方式,完整实现图的DFS算法,给定图数据文件(tinyG.txt),能够输出DFS的节点遍历结果,及每个节点的Pre和Post值

package t4f1;import java.io.File;import java.io.FileInputStream;//import java.io.FileNotFoundException;//import java.io.FileOutputStream;//import java.io.IOException;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];      i=i+1;      v2=lin[i];      arc[v1][v2]=1;      arc[v2][v1]=1;      }      graphDFS(arc);}catch (Exception e) {  e.printStackTrace();}}//读取txt文件并生成对应的邻接矩阵public static int time=1,count=0;public static int S[]=new int[V];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("G:\\tinyG.txt");}}


0 0
原创粉丝点击