图的BFS和DFS算法

1、广度优先搜索

import java.util.*;

public class Main {
    public static int NUM = 8;
    public static boolean[] visited = new boolean[NUM];
    public static ArcNode[] nodes = new ArcNode[NUM];
    public static Queue<ArcNode> queue = new LinkedList<>();

    public static void main(String [] args) {
        for (int i = 0; i < NUM; i++) {
            nodes[i] = new ArcNode(i + 1);
        }
        for (int i = 0; i < NUM; i++) {
            visited[i] = false;
        }
        nodes[0].nextArc = new ArcNode(2);
        nodes[0].nextArc.nextArc = new ArcNode(3);

        nodes[1].nextArc = new ArcNode(1);
        nodes[1].nextArc.nextArc = new ArcNode(4);
        nodes[1].nextArc.nextArc.nextArc = new ArcNode(5);

        nodes[2].nextArc = new ArcNode(1);
        nodes[2].nextArc.nextArc = new ArcNode(6);
        nodes[2].nextArc.nextArc.nextArc = new ArcNode(7);

        nodes[3].nextArc = new ArcNode(2);
        nodes[3].nextArc.nextArc = new ArcNode(8);

        nodes[4].nextArc = new ArcNode(2);
        nodes[4].nextArc.nextArc = new ArcNode(8);

        nodes[5].nextArc = new ArcNode(3);

        nodes[6].nextArc = new ArcNode(3);

        nodes[7].nextArc = new ArcNode(4);
        nodes[7].nextArc.nextArc = new ArcNode(5);

        BFSTravals(nodes);
    }

    private static void BFSTravals(ArcNode[] nodes) {
        for(int i = 0; i < nodes.length; i++) {
            if(!visited[nodes[i].data - 1]) {
                BFS(nodes[i]);
            }
        }
    }

    private static void BFS(ArcNode node) {
        if(node != null) {
            queue.offer(node);
            visited[node.data - 1] = true;

            while (queue.size() > 0) {
                ArcNode curNode = queue.poll();
                System.out.println(curNode.data);
                curNode = nodes[curNode.data - 1].nextArc;
                while (curNode != null) {
                    if(!visited[curNode.data - 1]) {
                        queue.offer(curNode);
                        visited[curNode.data - 1] = true;
                    }
                    curNode = curNode.nextArc;
                }
            }
        }
    }
    
    public static class ArcNode{
        int data;
        ArcNode nextArc;
        public ArcNode(int data){
            this.data = data;
        }
    }
}
2、深度优先搜索

public class Main {
    public static int NUM = 8;
    public static boolean[] visited = new boolean[NUM];
    public static ArcNode[] nodes = new ArcNode[NUM];

    public static void main(String [] args) {
        for (int i = 0; i < NUM; i++) {
            nodes[i] = new ArcNode(i + 1);
        }
        for (int i = 0; i < NUM; i++) {
            visited[i] = false;
        }
        nodes[0].nextArc = new ArcNode(2);
        nodes[0].nextArc.nextArc = new ArcNode(3);

        nodes[1].nextArc = new ArcNode(1);
        nodes[1].nextArc.nextArc = new ArcNode(4);
        nodes[1].nextArc.nextArc.nextArc = new ArcNode(5);

        nodes[2].nextArc = new ArcNode(1);
        nodes[2].nextArc.nextArc = new ArcNode(6);
        nodes[2].nextArc.nextArc.nextArc = new ArcNode(7);

        nodes[3].nextArc = new ArcNode(2);
        nodes[3].nextArc.nextArc = new ArcNode(8);

        nodes[4].nextArc = new ArcNode(2);
        nodes[4].nextArc.nextArc = new ArcNode(8);

        nodes[5].nextArc = new ArcNode(3);

        nodes[6].nextArc = new ArcNode(3);

        nodes[7].nextArc = new ArcNode(4);
        nodes[7].nextArc.nextArc = new ArcNode(5);

        DFSTravals(nodes);
    }

    private static void DFSTravals(ArcNode[] nodes) {
        for(int i = 0; i < nodes.length; i++) {
            if(!visited[nodes[i].data - 1]) {
                DFS(nodes[i]);
            }
        }
    }

    private static void DFS(ArcNode node) {
        visited[node.data - 1] = true;
        System.out.println(node.data);
        ArcNode curNode = nodes[node.data - 1];
        curNode = curNode.nextArc;
        while (curNode != null) {
            if(!visited[curNode.data - 1]) {
                DFS(curNode);
            }
            curNode = curNode.nextArc;
        }
    }

    public static class ArcNode{
        int data;
        ArcNode nextArc;
        public ArcNode(int data){
            this.data = data;
        }
    }
}


猜你喜欢

转载自blog.csdn.net/wei_lei/article/details/77838842