欢迎访问宙启技术站
智能推送

Java函数实现图的深度优先搜索和广度优先搜索算法

发布时间:2023-08-16 09:01:16

深度优先搜索(Depth First Search,DFS)和广度优先搜索(Breadth First Search,BFS)是图的常见搜索算法。它们可以用来遍历图中的节点,找到特定的节点或者确定两个节点之间的路径。

下面是Java中实现图的深度优先搜索和广度优先搜索算法的示例代码:

1. 图的定义

首先,我们需要定义一个图的类,表示图的节点和边的关系。

import java.util.*;

class Graph {
    private int V;  // 节点的数量
    private LinkedList<Integer> adj[];  // 邻接表

    // 构造函数
    Graph(int v) {
        V = v;
        adj = new LinkedList[v];
        for (int i=0; i<v; ++i)
            adj[i] = new LinkedList();
    }

    // 添加边
    void addEdge(int v, int w) {
        adj[v].add(w);
    }

    // 深度优先搜索
    void DFS(int v) {
        boolean visited[] = new boolean[V];  // 记录节点是否被访问过
        DFSUtil(v, visited);
    }

    // 深度优先搜索的辅助函数
    void DFSUtil(int v, boolean visited[]) {
        visited[v] = true;
        System.out.print(v + " ");

        Iterator<Integer> i = adj[v].listIterator();
        while (i.hasNext()) {
            int n = i.next();
            if (!visited[n])
                DFSUtil(n, visited);
        }
    }

    // 广度优先搜索
    void BFS(int v) {
        boolean visited[] = new boolean[V];  // 记录节点是否被访问过

        LinkedList<Integer> queue = new LinkedList<Integer>();

        visited[v] = true;
        queue.add(v);

        while (queue.size() != 0) {
            v = queue.poll();
            System.out.print(v + " ");

            Iterator<Integer> i = adj[v].listIterator();
            while (i.hasNext()) {
                int n = i.next();
                if (!visited[n]) {
                    visited[n] = true;
                    queue.add(n);
                }
            }
        }
    }
}

2. 示例使用

现在,我们来使用这些图的搜索算法。

public class Main {
    public static void main(String args[]) {
        Graph g = new Graph(4);  // 创建一个具有4个节点的图

        g.addEdge(0, 1);
        g.addEdge(0, 2);
        g.addEdge(1, 2);
        g.addEdge(2, 0);
        g.addEdge(2, 3);
        g.addEdge(3, 3);

        System.out.println("深度优先搜索结果:");
        g.DFS(2);

        System.out.println("
广度优先搜索结果:");
        g.BFS(2);
    }
}

输出结果为:

深度优先搜索结果:
2 0 1 3 
广度优先搜索结果:
2 0 3 1 

这是一个简单的示例,展示了图的深度优先搜索和广度优先搜索算法的实现。你可以根据需要修改图的节点和边的数量,以及添加更多的边。希望这个例子能对你有所帮助!