第四周__无向图的DFS算法

来源:互联网 发布:淘宝店铺logo尺寸 编辑:程序博客网 时间:2024/06/09 15:45
import java.io.File; 
import java.util.Queue; 
import java.util.Scanner; 
 
public class Gdfs { 
 
    private int vNum; 
    private int arcNum; 
    private int counter=1; 
    private int arc[][]; 
    private int pre[],post[]; 
    boolean[] visited; 
    public GraphDFS(int vNum,int arcNum){ 
        this.vNum=vNum; 
        this.arcNum=arcNum; 
        this.arc=new int[vNum][arcNum]; 
        visited=new boolean[vNum]; 
        pre=new int[vNum]; 
        post=new int[vNum]; 
    } 
    public int[][] getArc(){ 
        return arc; 
    } 
    public void addEdage(int v1,int v2){ 
        arc[v1][v2]=1; 
        arc[v2][v1]=1; 
    } 
    public static void main(String[] args) { 
        String path="src/tinyG.txt"; 
        try{ 
            Scanner scanner=new Scanner(new File(path)); 
            int vNum= scanner.nextInt(); 
            int arcNum=scanner.nextInt(); 
            GraphDFS g=new GraphDFS(vNum, arcNum); 
             
            for(int i=0;i<arcNum;i++){ 
                int v1=scanner.nextInt(); 
                int v2=scanner.nextInt(); 
                g.addEdage(v1, v2); 
            }  
            g.DFSTraverse(); 
            for(int i=0;i<vNum;i++){ 
                System.out.println("顶点:"+i+" pre:"+g.pre(i)+",post:"+g.post(i)); 
            } 
        }catch (Exception e) { 
            e.printStackTrace(); 
        } 
    } 
    public void DFSTraverse(){ 
        for(int i=0;i<vNum;i++){ 
            visited[i]=false; 
        } 
        System.out.println("深度优先遍历的结果是:"); 
        int j=1;//第几个连通分量的序号 
        for(int i=0;i<vNum;i++){//选取某个特定的点开始深度优先搜索 
            if(!visited[i]){ 
                System.out.println("第"+(j++)+"个连通分量:"); 
                dfs(i); 
                System.out.println(); 
            } 
        } 
    } 
    public int pre(int v){ 
         return pre[v]; 
    } 
    public int post(int v){ 
        return post[v];  
    } 
    public void dfs(int i){ 
        visited[i]=true; 
        System.out.print(i+" "); 
        pre[i]=counter++; 
        for(int j=0;j<vNum;j++){ 
            if(arc[i][j]==1&&!visited[j]){ 
                dfs(j); 
            } 
        } 
        post[i]=counter++; 
    } 
}
0 0
原创粉丝点击