首页 > 编程语言 >java中的图算法

java中的图算法

时间:2023-08-26 23:31:44浏览次数:43  
标签:java int graph vertices 算法 Java addEdge

Java中有许多用于图算法的库和框架。下面是一些常见的图算法及其在Java中的实现方式:

  1. 广度优先搜索(BFS):BFS用于在图中搜索最短路径。在Java中,可以使用LinkedList和HashSet来实现BFS算法。
  2. 深度优先搜索(DFS):DFS用于在图中搜索路径或查找连通分量。在Java中,可以使用递归或栈来实现DFS算法。
  3. 最小生成树算法:常见的最小生成树算法包括Prim算法和Kruskal算法。在Java中,可以使用优先队列和并查集来实现这些算法。
  4. 最短路径算法:常见的最短路径算法包括Dijkstra算法和Bellman-Ford算法。在Java中,可以使用优先队列或动态规划来实现这些算法。
  5. 拓扑排序:拓扑排序用于对有向无环图进行排序。在Java中,可以使用深度优先搜索或广度优先搜索来实现拓扑排序。
  6. 强连通分量算法:强连通分量算法用于查找有向图中的强连通分量。在Java中,可以使用Tarjan算法或Kosaraju算法来实现这些算法。 以上仅是一些常见的图算法及其在Java中的实现方式,实际上还有许多其他的图算法和实现方式。在开发中,可以根据具体需求选择合适的算法和库来解决问题。


以下是在Java中实现广度优先搜索(BFS)算法的示例代码:

javaCopy codeimport java.util.*;
public class Graph {
    private int vertices; // 图的顶点数
    private LinkedList<Integer>[] adjacencyList; // 邻接表表示图
    public Graph(int vertices) {
        this.vertices = vertices;
        adjacencyList = new LinkedList[vertices];
        for (int i = 0; i < vertices; i++) {
            adjacencyList[i] = new LinkedList<>();
        }
    }
    public void addEdge(int source, int destination) {
        adjacencyList[source].add(destination);
    }
    public void BFS(int startVertex) {
        boolean[] visited = new boolean[vertices];
        LinkedList<Integer> queue = new LinkedList<>();
        visited[startVertex] = true;
        queue.add(startVertex);
        while (!queue.isEmpty()) {
            int currentVertex = queue.poll();
            System.out.print(currentVertex + " ");
            LinkedList<Integer> neighbors = adjacencyList[currentVertex];
            for (int neighbor : neighbors) {
                if (!visited[neighbor]) {
                    visited[neighbor] = true;
                    queue.add(neighbor);
                }
            }
        }
    }
    public static void main(String[] args) {
        Graph graph = new Graph(6);
        graph.addEdge(0, 1);
        graph.addEdge(0, 2);
        graph.addEdge(1, 3);
        graph.addEdge(2, 3);
        graph.addEdge(2, 4);
        graph.addEdge(3, 4);
        graph.addEdge(3, 5);
        System.out.println("BFS traversal starting from vertex 0:");
        graph.BFS(0);
    }
}

运行上述代码,将输出从顶点0开始的广度优先搜索遍历结果:0 1 2 3 4 5。 以上代码展示了如何使用邻接表来表示图,以及如何实现广度优先搜索算法。在BFS方法中,我们使用一个队列来存储待访问的顶点,并使用一个布尔数组来记录顶点是否被访问过。通过不断从队列中取出顶点,然后将其邻居顶点加入队列,并标记为已访问,直到队列为空为止。 你可以根据需要修改和扩展示例代码来实现其他的图算法。

以下是在Java中实现深度优先搜索(DFS)算法的示例代码:

javaCopy codeimport java.util.*;
public class Graph {
    private int vertices; // 图的顶点数
    private LinkedList<Integer>[] adjacencyList; // 邻接表表示图
    public Graph(int vertices) {
        this.vertices = vertices;
        adjacencyList = new LinkedList[vertices];
        for (int i = 0; i < vertices; i++) {
            adjacencyList[i] = new LinkedList<>();
        }
    }
    public void addEdge(int source, int destination) {
        adjacencyList[source].add(destination);
    }
    public void DFS(int startVertex) {
        boolean[] visited = new boolean[vertices];
        DFSUtil(startVertex, visited);
    }
    private void DFSUtil(int currentVertex, boolean[] visited) {
        visited[currentVertex] = true;
        System.out.print(currentVertex + " ");
        LinkedList<Integer> neighbors = adjacencyList[currentVertex];
        for (int neighbor : neighbors) {
            if (!visited[neighbor]) {
                DFSUtil(neighbor, visited);
            }
        }
    }
    public static void main(String[] args) {
        Graph graph = new Graph(6);
        graph.addEdge(0, 1);
        graph.addEdge(0, 2);
        graph.addEdge(1, 3);
        graph.addEdge(2, 3);
        graph.addEdge(2, 4);
        graph.addEdge(3, 4);
        graph.addEdge(3, 5);
        System.out.println("DFS traversal starting from vertex 0:");
        graph.DFS(0);
    }
}

运行上述代码,将输出从顶点0开始的深度优先搜索遍历结果:0 1 3 4 2 5。 以上代码展示了如何使用邻接表来表示图,以及如何实现深度优先搜索算法。在DFS方法中,我们使用一个布尔数组来记录顶点是否被访问过,并递归地访问顶点的邻居顶点。通过递归调用DFSUtil方法,我们可以实现深度优先搜索遍历。 你可以根据需要修改和扩展示例代码来实现其他的图算法。

标签:java,int,graph,vertices,算法,Java,addEdge
From: https://blog.51cto.com/u_15702012/7246664

相关文章

  • 面对算法竞赛OI的Linux下vim简易配置
    这段配置基本通用但是需要vim支持clipboard才能复制到系统剪切板下面是配置正文.vimrcletmapleader="\<space>"vnoremap<leader>y"+yinoremapjk<ESC>nnoremap<leader>e<esc>:w<cr>:!g++%-o%<-fsanitize=undefined-Wall-g<c......
  • Java实现数据导出到excel文件
    Java实现数据导出到excel文件使用的依赖:Apache提供的poi包首先导入依赖<dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>5.2.2</version></dependency>核心实现//创建一个工作簿,也就是Excel......
  • 「算法与数据结构」梳理6大排序算法 为了offer!
    6种排序如下......
  • 多元回归预测 | Matlab 蛇群算法优化随机森林(SO-RF)回归预测
    ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。......
  • 基于JavaWeb的游戏信息管理系统设计与实现-计算机毕业设计源码
    摘要随着信息技术的发展,基于web模式的管理系统逐渐普及,网上查找信息是目前广受欢迎的模式。基于JavaWeb的游戏信息管理系统可以适应现代化快节奏的游戏方式,满足各类人群足不出户的在线查找游戏,利用基于JavaWeb的游戏信息管理系统可以获取游戏的排名信息,并可以记录个人的游戏数据,......
  • 基于Java的学生管理系统-计算机毕业设计源码+LW文档
    摘 要计算机信息技术的迅猛发展,改变了人们的生产生活方式。越来越多的教务管理使用管理系统进行管理,用来提高管理效率。在传统的教学管理中,往往通过大量的人力和物力进行管理,通过手工记录课程信息,统计科目资料。这种传统的管理方法容易出错,而且不能适应现代化、信息化的发展过程......
  • Java字符串替换
    JavaStringreplaceAll详解总结:Java编译期\为转义符,运行期正则表达式\为转义符,正则表达式匹配\需使用\\。replace为普通字符串替换,replaceAll为正则表达式替换(第一个参数为正则表达式,第二个参数中\为转义字符,$为正则字符),第二个参数表示\需使用\\。示例:替换字符串中的""......
  • [转]vcpkg+opencv4(sfm+vtk)+openMVS+SFM算法-github代下载(http://gitd.cc/)
    1、vcpkg+opencv4(sfm+vtk)+openMVS+SFM算法-github代下载(http://gitd.cc/)2、OpenMVS详细安装教程(ubuntu18.04)3、ubuntu18.04安装openMVS......
  • 【LeetCode回溯算法#12】二叉树的直径,树形dp的前置内容(使用dfs)
    二叉树的直径给你一棵二叉树的根节点,返回该树的直径。二叉树的直径是指树中任意两个节点之间最长路径的长度。这条路径可能经过也可能不经过根节点root。两节点之间路径的长度由它们之间边数表示。示例1:输入:root=[1,2,3,4,5]输出:3解释:3,取路径[4,2,1,3]或......
  • Java实现数据导出到excel文件
    使用的依赖:Apache提供的poi包首先导入依赖<dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>5.2.2</version></dependency> 核心实现//创建一个工作簿,也就是Excel文件HSSFWorkbookwb=n......