Java图搜索算法详解:探索图论中的奥秘

图搜索算法是图论领域的重要内容,它在解决各种实际问题中起着关键作用。本文将详细介绍几种常见的Java图搜索算法,包括深度优先搜索(DFS)、广度优先搜索(BFS)以及Dijkstra算法,帮助读者深入理解图搜索算法的原理和应用。

1. 深度优先搜索(DFS)

深度优先搜索是一种递归的搜索算法,它从图的某一顶点出发,沿着一条路径尽可能深地搜索,直到到达最远的顶点,然后再回溯到上一个顶点,继续搜索其他路径。DFS通常使用栈来实现,其时间复杂度为O(V+E),其中V是顶点数,E是边数。

java 复制代码
import java.util.*;

public class DepthFirstSearch {
    private boolean[] visited;
    private List<List<Integer>> graph;

    public DepthFirstSearch(int n) {
        visited = new boolean[n];
        graph = new ArrayList<>();
        for (int i = 0; i < n; i++) {
            graph.add(new ArrayList<>());
        }
    }

    public void addEdge(int u, int v) {
        graph.get(u).add(v);
    }

    public void dfs(int u) {
        visited[u] = true;
        System.out.print(u + " ");
        for (int v : graph.get(u)) {
            if (!visited[v]) {
                dfs(v);
            }
        }
    }

    public static void main(String[] args) {
        DepthFirstSearch dfs = new DepthFirstSearch(5);
        dfs.addEdge(0, 1);
        dfs.addEdge(0, 2);
        dfs.addEdge(1, 3);
        dfs.addEdge(1, 4);
        dfs.dfs(0); // 从节点0开始深度优先搜索
    }
}

2. 广度优先搜索(BFS)

广度优先搜索是一种迭代的搜索算法,它从图的某一顶点出发,逐层地搜索,直到找到目标顶点或者遍历完所有顶点。BFS通常使用队列来实现,其时间复杂度同样为O(V+E)。

java 复制代码
import java.util.*;

public class BreadthFirstSearch {
    private boolean[] visited;
    private List<List<Integer>> graph;

    public BreadthFirstSearch(int n) {
        visited = new boolean[n];
        graph = new ArrayList<>();
        for (int i = 0; i < n; i++) {
            graph.add(new ArrayList<>());
        }
    }

    public void addEdge(int u, int v) {
        graph.get(u).add(v);
    }

    public void bfs(int u) {
        Queue<Integer> queue = new LinkedList<>();
        visited[u] = true;
        queue.offer(u);
        while (!queue.isEmpty()) {
            int cur = queue.poll();
            System.out.print(cur + " ");
            for (int v : graph.get(cur)) {
                if (!visited[v]) {
                    visited[v] = true;
                    queue.offer(v);
                }
            }
        }
    }

    public static void main(String[] args) {
        BreadthFirstSearch bfs = new BreadthFirstSearch(5);
        bfs.addEdge(0, 1);
        bfs.addEdge(0, 2);
        bfs.addEdge(1, 3);
        bfs.addEdge(1, 4);
        bfs.bfs(0); // 从节点0开始广度优先搜索
    }
}

3. Dijkstra算法

Dijkstra算法是一种用于计算图中单源最短路径的贪心算法,它通过维护一个优先队列来选择下一个要访问的顶点,并不断更新顶点到源顶点的最短距离。Dijkstra算法适用于边权值非负的有向图或无向图,其时间复杂度为O(V^2),其中V是顶点数。

java 复制代码
import java.util.*;

public class Dijkstra {
    private int[] dist;
    private boolean[] visited;
    private List<List<int[]>> graph;

    public Dijkstra(int n) {
        dist = new int[n];
        visited = new boolean[n];
        Arrays.fill(dist, Integer.MAX_VALUE);
        graph = new ArrayList<>();
        for (int i = 0; i < n; i++) {
            graph.add(new ArrayList<>());
        }
    }

    public void addEdge(int u, int v, int w) {
        graph.get(u).add(new int[] { v, w });
    }

    public void dijkstra(int src) {
        PriorityQueue<int[]> pq = new PriorityQueue<>(Comparator.comparingInt(a -> a[1]));
        dist[src] = 0;
        pq.offer(new int[] { src, 0 });
        while (!pq.isEmpty()) {
            int[] cur = pq.poll();
            int u = cur[0];
            if (visited[u]) continue;
            visited[u] = true;
            for (int[] edge : graph.get(u)) {
                int v = edge[0];
                int w = edge[1];
                if (!visited[v] && dist[u] + w < dist[v]) {
                    dist[v] = dist[u] + w;
                    pq.offer(new int[] { v, dist[v] });
                }
            }
        }
    }

    public static void main(String[] args) {
        Dijkstra dijkstra = new Dijkstra(5);
        dijkstra.addEdge(0, 1, 10);
        dijkstra.addEdge(0, 2, 5);
        dijkstra.addEdge(1, 3, 2);
        dijkstra.addEdge(2, 1, 3);
        dijkstra.addEdge(2, 3, 9);
        dijkstra.dijkstra(0); // 从节点0开始Dijkstra算法
    }
}

结论

Java图搜索算法是图论中的重要内容,掌握这些算法对于解决各种实际问题至关重要。通过本文的介绍和实例演示,读者可以更加深入地理解深度优先搜索、广度优先搜索和Dijkstra算法的原理和应用,为解决实际问题提供了强有力的工具和思路。

感谢您阅读本文,欢迎"一键三连"。作者定会不负众望,按时按量创作出更优质的内容。

❤️ 1. 毕业设计专栏,毕业季咱们不慌,上千款毕业设计等你来选。

相关推荐
梅见十柒8 天前
数据结构与算法分析:你真的理解图算法吗——深度优先搜索(代码详解+万字长文)
c语言·c++·经验分享·笔记·算法·深度优先·图搜索算法
攻城狮7号16 天前
【4.9】图搜索算法-BFS解打开转盘锁
c++·算法·深度优先·宽度优先·图搜索算法
不是很强 但是很秃20 天前
代码随想录算法day43 | 图论part01 | 图论理论基础,深搜理论基础,98. 所有可达路径,广搜理论基础
java·数据结构·算法·leetcode·图论·迭代加深·图搜索算法
一棵星22 天前
遍历有向图链路(DFS算法)- 优化版
java·算法·dfs·图搜索算法
攻城狮7号25 天前
【4.8】图搜索算法-BFS解单词接龙
c++·算法·深度优先·宽度优先·图搜索算法
RacheV+TNY2642781 个月前
拍立淘按图搜索商品列表接口系列,API接口开发
算法·图搜索算法
Jason-河山1 个月前
按图搜索1688商品(拍立淘) :API接口编程
java·python·算法·图搜索算法
攻城狮7号1 个月前
【4.7】图搜索算法-DFS和BFS解根到叶子节点数字之和
c++·算法·深度优先·宽度优先·图搜索算法
攻城狮7号1 个月前
【4.5】图搜索算法-BFS和DFS求岛屿的最大面积
c++·算法·深度优先·宽度优先·图搜索算法
攻城狮7号1 个月前
【4.6】图搜索算法-DFS和BFS解合并二叉树
c++·算法·深度优先·宽度优先·图搜索算法