JGraphT 在 Spring Boot 中的应用实践

发布于:2025-04-08 ⋅ 阅读:(15) ⋅ 点赞:(0)

1. 引言

1.1 什么是 JGraphT

JGraphT 是一个用于处理图数据结构和算法的 Java 库,提供了丰富的图类型和算法实现。

1.2 为什么使用 JGraphT

  • 丰富的图类型:支持简单图、多重图、伪图等多种图类型。
  • 强大的算法库:提供最短路径、最小生成树、拓扑排序等多种算法。
  • 易于集成:易于与 Spring Boot 等框架集成。

2. 环境准备

2.1 安装 Java 和 Maven

确保系统中已安装 Java 和 Maven。

2.2 创建 Spring Boot 项目

使用 Spring Initializr 创建一个新的 Spring Boot 项目。

2.3 添加 JGraphT 依赖

pom.xml 文件中添加 JGraphT 依赖。

<dependency>
    <groupId>org.jgrapht</groupId>
    <artifactId>jgrapht-core</artifactId>
    <version>1.5.1</version>
</dependency>

3. JGraphT 基本概念

3.1 图的基本概念

3.1.1 顶点(Vertices)

顶点是图中的基本元素,表示图中的节点。

3.1.2 边(Edges)

边连接两个顶点,表示顶点之间的关系。

3.1.3 有向图与无向图

  • 有向图:边有方向,表示单向关系。
  • 无向图:边无方向,表示双向关系。

3.2 JGraphT 中的图类型

3.2.1 简单图(Simple Graphs)

简单图不允许重复边和自环。

3.2.2 多重图(Multigraphs)

多重图允许重复边,但不允许自环。

3.2.3 伪图(Pseudographs)

伪图允许重复边和自环。

4. 集成 JGraphT 到 Spring Boot

4.1 添加 JGraphT 依赖

确保 pom.xml 中已添加 JGraphT 依赖。

<dependency>
    <groupId>org.jgrapht</groupId>
    <artifactId>jgrapht-core</artifactId>
    <version>1.5.1</version>
</dependency>

4.2 创建图数据结构

定义图数据结构并添加顶点和边。

import org.jgrapht.Graph;
import org.jgrapht.graph.DefaultEdge;
import org.jgrapht.graph.SimpleGraph;

public class GraphExample {
   
    public static void main(String[] args) {
   
        // 创建一个简单的无向图
        Graph<String, DefaultEdge> graph = new SimpleGraph<>(DefaultEdge.class);

        // 添加顶点
        String vertex1 = "A";
        String vertex2 = "B";
        String vertex3 = "C";
        graph.addVertex(vertex1);
        graph.addVertex(vertex2);
        graph.addVertex(vertex3);

        // 添加边
        graph.addEdge(vertex1, vertex2);
        graph.addEdge(vertex2, vertex3);
        graph.addEdge(vertex3, vertex1);

        // 打印图的顶点和边
        System.out.println("Vertices: " + graph.vertexSet());
        System.out.println("Edges: " + graph.edgeSet());
    }
}

4.3 使用 Spring Boot 配置图

在 Spring Boot 应用中配置图数据结构。

import org.jgrapht.Graph;
import org.jgrapht.graph.DefaultEdge;
import org.jgrapht.graph.SimpleGraph;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class GraphConfig {
   

    @Bean
    public Graph<String, DefaultEdge> graph() {
   
        Graph<String, DefaultEdge> graph = new SimpleGraph<>(DefaultEdge.class);

        // 添加顶点
        String vertex1 = "A";
        String vertex2 = "B";
        String vertex3 = "C";
        graph.addVertex(vertex1);
        graph.addVertex(vertex2);
        graph.addVertex(vertex3);

        // 添加边
        graph.addEdge(vertex1, vertex2);
        graph.addEdge(vertex2, vertex3);
        graph.addEdge(vertex3, vertex1);

        return graph;
    }
}

5. 图操作与算法

5.1 添加和删除顶点

在图中添加和删除顶点。

import org.jgrapht.Graph;
import org.jgrapht.graph.DefaultEdge;
import org.jgrapht.graph.SimpleGraph;

public class GraphOperations {
   
    public static void main(String[] args) {
   
        Graph<String, DefaultEdge> graph = new SimpleGraph<>(DefaultEdge.class);

        // 添加顶点
        graph.addVertex("A");
        graph.addVertex("B");

        // 删除顶点
        graph.removeVertex("A");

        System.out.println("Vertices: " + graph.vertexSet());
    }
}

5.2 添加和删除边

在图中添加和删除边。

import org.jgrapht.Graph;
import org.jgrapht.graph.DefaultEdge;
import org.jgrapht.graph.SimpleGraph;

public class GraphOperations {
   
    public static void main(String[] args) {
   
        Graph<String, DefaultEdge> graph = new SimpleGraph<>(DefaultEdge.class);

        // 添加顶点
        graph.addVertex("A");
        graph.addVertex("B");

        // 添加边
        graph.addEdge("A", "B");

        // 删除边
        graph.removeEdge("A", "B");

        System.out.println("Edges: " + graph.edgeSet());
    }
}

5.3 使用图算法

使用 JGraphT 提供的图算法。

5.3.1 最短路径算法

使用 Dijkstra 算法计算最短路径。

import org.jgrapht.Graph;
import org.jgrapht.graph.DefaultEdge;
import org.jgrapht.graph.SimpleWeightedGraph;
import org.jgrapht.alg.shortestpath.DijkstraShortestPath;

public class ShortestPathExample {
   
    public static void main(String[] args) {
   
        Graph<String, DefaultEdge> graph = new SimpleWeightedGraph<>(DefaultEdge.class);

        // 添加顶点
        graph.addVertex("A");
        graph.addVertex("B");
        graph.addVertex("C");

        // 添加带权重的边
        graph.setEdgeWeight(graph.addEdge("A", "B"), 1.0);
        graph.setEdgeWeight(graph.addEdge("B", "C"), 2.0);
        graph.setEdgeWeight(graph.addEdge("A", "C"), 4.0);

        // 使用 Dijkstra 算法计算最短路径
        DijkstraShortestPath<String, DefaultEdge> dijkstraAlg = new DijkstraShortestPath<>(graph);
        System.out.println("Shortest path from A to C: " + dijkstraAlg.getPath("A", "C"));
    }
}

5.3.2 最小生成树算法

使用 Kruskal 算法计算最小生成树。

import org.jgrapht.Graph;
import org.jgrapht.graph.DefaultEdge;
import org.jgrapht.graph.SimpleWeightedGraph;
import org.jgrapht.alg.spanning.KruskalMinimumSpanningTree;

public class MinimumSpanningTreeExample {
   
    public static void main

网站公告

今日签到

点亮在社区的每一天
去签到