0
点赞
收藏
分享

微信扫一扫

图遍历算法

何以至千里 2022-02-19 阅读 56

import java.util.LinkedList;

/**
 * BFS和DFS  解决图的遍历
 * */
public class IteratorAlgorithm {
    public static void main(String[] args) {
        // https://blog.csdn.net/yimixgg/article/details/90023121
        //index 0~4
        int[][] m =  {
                { 0, 1, 1, 0, 0 },
                { 0, 0, 1, 1, 0 },
                { 0, 1, 1, 1, 0 },
                { 1, 0, 0, 0, 0 },
                { 0, 0, 1, 1, 0 }
        };
        //bfs(m,4);
        //dfs(m,4);

        //递归实现dfs
        int[] book=new int[m.length];
        book[4] = 1; //1表示已经遍历
        System.out.println(4);
        dfs2(m,book,4,0);
    }

    private static void bfs(int[][] m,int index){
        //广度优先遍历
        //不考虑index异常情况
        LinkedList<Integer> queue=new LinkedList<>();
        int[] visited = new int[m.length]; //1表示进队列,2表示已遍历
        queue.offer(index); //加到队列后面
        visited[index] = 1;
        while(!queue.isEmpty()){
            int i = queue.poll(); //从前面取
            visited[i] = 2;
            System.out.println(i);
            for(int j=0;j<m.length;j++)
            if(m[i][j]==1&&visited[j]==0){
                queue.offer(j);
                visited[j] = 1;
            }
        }
    }

    private static void dfs(int[][] m,int index){
        //深度优先遍历
        //不考虑index异常情况
        LinkedList<Integer> stack=new LinkedList<>();
        int[] visited = new int[m.length]; //1表示进队列,2表示已遍历
        stack.push(index); //压入栈
        System.out.println("放入"+index);
        visited[index]=1;
        while(!stack.isEmpty()){
            int tmpIndex= stack.peek(); //返回头部元素不删除
            boolean flag=false;
            if(visited[tmpIndex]!=2){
                System.out.println(tmpIndex);
                visited[tmpIndex]=2;
            }
            for(int i=0;i<m.length;i++){
                if(m[tmpIndex][i]==1&&visited[i]==0){
                    flag=true;
                    stack.push(i);
                    System.out.println("放入"+i);
                    visited[i]=1;
                    break;
                }
            }
            if(!flag){
                System.out.println("删除"+stack.peek());
                stack.pop();
            }
        }
    }
    //更简单的dfs实现,递归
    private static void dfs2(int[][] m,int[] book,int index,int sum){
        sum++;
        if(sum == m.length){
            return;
        }
        for(int i=0;i<m.length;i++){
            if(m[index][i]==1&&book[i]==0){
                book[i] = 1;
                System.out.println(i);
                dfs2(m,book,i,sum);
            }
        }
    }
}
 

举报

相关推荐

0 条评论