【算法】图的常见算法与Java实现代码

news/2024/7/20 21:21:16 标签: 算法, java, 深度优先

图的常见算法包括深度优先搜索(DFS)、广度优先搜索(BFS)、最短路径算法(Dijkstra算法和Bellman-Ford算法)、最大流算法(Ford-Fulkerson算法和Edmonds-Karp算法)等。下面给出这些算法的Java示例。

1、深度优先搜索(DFS)

java">public void dfs(int v, boolean[] visited, List<List<Integer>> adjList) {
    visited[v] = true;
    System.out.print(v + " ");
    for (int i = 0; i < adjList.get(v).size(); i++) {
        int u = adjList.get(v).get(i);
        if (!visited[u]) {
            dfs(u, visited, adjList);
        }
    }
}

2、广度优先搜索(BFS)

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

3、最短路径算法(Dijkstra算法

java">public double[] dijkstra(int s) {
    double[] dist = new double[V];
    for (int i = 0; i < V; i++) {
        dist[i] = Double.POSITIVE_INFINITY;
    }
    dist[s] = 0;
    boolean[] visited = new boolean[V];
    PriorityQueue<Node> pq = new PriorityQueue<>();
    pq.offer(new Node(s, 0));
    while (!pq.isEmpty()) {
        Node node = pq.poll();
        int v = node.v;
        if (visited[v]) {
            continue;
        }
        visited[v] = true;
        for (int u : adjList[v]) {
            double d = dist[v] + weight(v, u);
            if (dist[u] > d) {
                dist[u] = d;
                pq.offer(new Node(u, d));
            }
        }
    }
    return dist;
}

4、最短路径算法(Bellman-Ford算法

java">public void bellmanFord(int s) {
    double[] dist = new double[V];
    for (int i = 0; i < V; i++) {
        dist[i] = Double.POSITIVE_INFINITY;
    }
    dist[s] = 0;
    for (int i = 1; i <= V - 1; i++) {
        for (int j = 0; j < V; j++) {
            for (int k = 0; k < adjList[j].size(); k++) {
                int u = adjList[j].get(k);
                double d = dist[j] + weight(j, u);
                if (dist[u] > d) {
                    dist[u] = d;
                } else if (dist[u] == d && rand.nextDouble() < 0.5) { // 处理负权环问题,随机选择一个路径即可。
                    dist[u] = d;
                }
            }
        }
    }
}

http://www.niftyadmin.cn/n/4984259.html

相关文章

JavaScript数值计算时精度问题处理

js精度问题 当使用 JavaScript 进行数值计算时&#xff0c;会面临一些精度问题&#xff0c;这些问题可能会导致不正确的结果。以下是一些常见的奇奇怪怪的 js 数据精度问题&#xff1a; 1. 浮点数精度问题 在 JS 中&#xff0c;浮点数的精度有限。例如&#xff1a; 0.1 0.…

巨人互动|游戏出海游戏出海需要考虑哪些方面?

游戏出海是指将游戏产品推向国外市场&#xff0c;以扩大用户群体和增加盈利空间&#xff0c;那么要成功地进行游戏出海&#xff0c;需要考虑哪些方面呢&#xff1f;本文小编对此来讲讲吧&#xff01; 1、目标市场选择 选择适合游戏产品的目标市场是出海的首要考虑因素&#xf…

docker拉取镜像报错

#拉取镜像报错如下 failed to register layer: exit status 22: unpigz: abort: zlib version less than 1.2.3这个是因为pigz的bug github链接。 复现&#xff1a; # 查看pigz版本 ~]# pigz version zlib version less than 1.2.3 #但是实际上我的zlib版本是大于1.2.3的&am…

基于PID优化和矢量控制装置的四旋翼无人机(MatlabSimulink实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

ssm学生宿舍管理系统源码和论文

ssm学生宿舍管理系统源码和论文094 开发工具&#xff1a;idea 数据库mysql5.7 数据库链接工具&#xff1a;navcat,小海豚等 技术&#xff1a;ssm 选题背景、意义 经过查阅资料和调查统计发现&#xff0c;高校学生宿舍管理工作变得越来越繁重和琐碎&#xff0c;如在学生住…

Weblogic漏洞(一)之 Weblogic基本介绍

Weblogic基本介绍 WebLogic是美国Oracle公司出品的一个application server&#xff0c;确切的说是一个基于JAVAEE架构的中间件&#xff0c;WebLogic是用于开发、集成、部署和管理大型分布式Web应用、网络应用和数据库应用的Java应用服务器。将Java的动态功能和Java Enterprise…

A系统跳转到B系统URl传参与接收

处理url字符串拼接方法new URLSearchParams() A系统 let data { study_id: row.study_id, hospital_id: row.hospital_id, pageType: detail };let params new URLSearchParams(); for (let key in data) {params.append(key, data[key]); } window.open(url ? params.toS…

重磅!TikTok将于8月底关闭半闭环 切断外链意在电商业务发展?

自2019年开始&#xff0c;TikTok电商业务逐渐走进人们的视线&#xff0c;并引起了市场的广泛关注。作为一家短视频平台&#xff0c;TikTok能够依靠其强大的用户基数与精准的推广策略&#xff0c;将流量成功转化为商业价值。截至目前&#xff0c;TikTok电商业务已经初步形成完整…