一、项目简介
本项目基于 Java Swing 图形界面 +Dijkstra最短路径算法 实现校园导航系统。能够模拟校园内多个地标节点,用户可自由选择起点和终点,程序自动计算出校园内最短步行路径与总距离,可视化展示完整行走路线。
项目适用于 数据结构课程设计、Java课程设计、最短路径算法实战,代码完整可运行、无第三方依赖、结构清晰、非常适合初学者学习与毕业设计使用。
项目功能
-
✅ 自定义校园地点节点(校门、图书馆、教学楼、食堂、宿舍楼)
-
✅ 构建校园无向道路网络图
-
✅ Dijkstra 算法求解全局最短路径
-
✅ Swing 可视化图形界面,操作简单
-
✅ 动态输出行走路线、总距离
-
✅ 修复起点终点一致时的报错BUG
二、技术栈说明
-
编程语言:Java
-
GUI框架:Swing(原生JDK,无需导入依赖)
-
核心算法:Dijkstra单源最短路径算法(优先队列优化)
-
数据结构:邻接表存储图、优先队列、数组、List集合
三、系统设计思路
1. 节点设计(地点)
自定义 Node 类,存储校园节点 ID 和地点名称,代表校园中的每一个地标位置。
2. 边设计(道路)
自定义 Edge 类,存储目标节点编号与道路权重(距离),校园道路为无向图,双向通行距离一致。
3. 图结构存储
使用 List<List<Edge>> 邻接表存储整张校园地图,空间效率高,适合稀疏图。
4. Dijkstra算法原理
通过优先队列不断选出当前最短距离节点,松弛更新邻边距离,最终得到起点到所有节点的最短距离,并通过前驱数组回溯完整路径。
四、完整可运行源码
java
/**
* @Author crowed by 王国政
* @Date 2026/09/11 0011 9:56
*/
import javax.swing.*;
import java.awt.*;
import java.util.*;
import java.util.List;
// 地点节点
class Node {
String name;
int id;
Node(int id, String name) {
this.id = id;
this.name = name;
}
}
// 边(道路)
class Edge {
int to;
double weight;
Edge(int to, double weight) {
this.to = to;
this.weight = weight;
}
}
// Dijkstra算法核心工具类
class DijkstraUtil {
private List<List<Edge>> graph;
private int nodeNum;
public DijkstraUtil(int n) {
nodeNum = n;
graph = new ArrayList<>();
for(int i=0;i<n;i++){
graph.add(new ArrayList<>());
}
}
// 添加无向边
public void addEdge(int from, int to, double w) {
graph.get(from).add(new Edge(to,w));
graph.get(to).add(new Edge(from,w));
}
// Dijkstra最短路径计算
public Map<String, Object> dijkstra(int startId, int endId){
double[] dist = new double[nodeNum];
Arrays.fill(dist, Double.MAX_VALUE);
int[] prev = new int[nodeNum];
Arrays.fill(prev, -1);
dist[startId] = 0;
// 优先队列:按距离升序
PriorityQueue<double[]> pq = new PriorityQueue<>(Comparator.comparingDouble(o -> o[0]));
pq.add(new double[]{0, startId});
while(!pq.isEmpty()){
double[] curr = pq.poll();
int u = (int) curr[1];
double d = curr[0];
if(d > dist[u]) continue;
for(Edge e : graph.get(u)){
int v = e.to;
if(dist[v] > dist[u] + e.weight){
dist[v] = dist[u] + e.weight;
prev[v] = u;
pq.add(new double[]{dist[v], v});
}
}
}
// 回溯路径
List<Integer> path = new ArrayList<>();
for(int cur = endId; cur != -1; cur = prev[cur]){
path.add(cur);
}
Collections.reverse(path);
Map<String,Object> res = new HashMap<>();
res.put("distance", dist[endId]);
res.put("path", path);
return res;
}
}
// 校园导航GUI主界面
public class CampusNav extends JFrame {
DijkstraUtil dijkstra;
List<Node> nodeList;
JComboBox<String> startBox, endBox;
JTextArea resultArea;
public CampusNav(){
// 窗口基础设置
setTitle("校园最短路径导航系统(Dijkstra算法)");
setSize(600,400);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(new BorderLayout());
// 初始化校园节点
nodeList = new ArrayList<>();
nodeList.add(new Node(0,"校门"));
nodeList.add(new Node(1,"图书馆"));
nodeList.add(new Node(2,"教学楼A"));
nodeList.add(new Node(3,"食堂"));
nodeList.add(new Node(4,"宿舍楼"));
// 初始化地图道路
dijkstra = new DijkstraUtil(5);
dijkstra.addEdge(0,1,120);
dijkstra.addEdge(1,2,80);
dijkstra.addEdge(1,3,150);
dijkstra.addEdge(2,3,90);
dijkstra.addEdge(3,4,70);
dijkstra.addEdge(0,2,220);
// 顶部选择面板
JPanel topPanel = new JPanel();
topPanel.add(new JLabel("起点:"));
startBox = new JComboBox<>();
endBox = new JComboBox<>();
for(Node n : nodeList){
startBox.addItem(n.name);
endBox.addItem(n.name);
}
topPanel.add(startBox);
topPanel.add(new JLabel("终点:"));
topPanel.add(endBox);
JButton btnCalc = new JButton("计算最短路径");
topPanel.add(btnCalc);
// 结果展示区域
resultArea = new JTextArea();
resultArea.setLineWrap(true);
JScrollPane scroll = new JScrollPane(resultArea);
add(topPanel, BorderLayout.NORTH);
add(scroll, BorderLayout.CENTER);
// 按钮点击事件
btnCalc.addActionListener(e -> {
int startIdx = startBox.getSelectedIndex();
int endIdx = endBox.getSelectedIndex();
Map<String,Object> ans = dijkstra.dijkstra(startIdx, endIdx);
double dis = (Double) ans.get("distance");
List<Integer> pathId = (List<Integer>) ans.get("path");
StringBuilder sb = new StringBuilder();
sb.append("===== 最短路径结果 =====\n");
sb.append("总距离:").append(dis).append(" 米\n");
sb.append("路线:");
for(int i = 0; i < pathId.size(); i++){
sb.append(nodeList.get(pathId.get(i)).name);
if(i != pathId.size()-1){
sb.append(" → ");
}
}
resultArea.setText(sb.toString());
});
}
public static void main(String[] args) {
// Swing线程安全启动
SwingUtilities.invokeLater(()->{
new CampusNav().setVisible(true);
});
}
}
五、代码模块解析
1. Node 节点类
存储每一个校园地点的编号和名称,是图结构中的顶点数据。
2. Edge 边类
记录当前道路通向的节点和道路长度权重,构成图的边信息。
3. DijkstraUtil 算法工具类
封装图的构建、最短路径计算逻辑。采用优先队列优化,时间复杂度更低,路径回溯可以完整还原行走路线。
4. GUI界面模块
通过下拉框选择起止地点,点击按钮触发算法计算,最终将最短距离、完整行走路线展示在文本域中。修复了原代码起点终点相同时字符串截取报错的BUG。
六、运行效果演示
-
运行程序后弹出可视化窗口;
-
选择起点、终点;
-
点击【计算最短路径】;
-
系统自动输出最优路径与总米数。
测试案例:校门 → 宿舍楼
最短路径:校门 → 图书馆 → 教学楼A → 食堂 → 宿舍楼
总距离:360.0 米
七、项目亮点总结
-
代码结构分层清晰:实体类、算法工具类、UI界面分离
-
标准 Dijkstra 优先队列优化算法,学习价值高
-
Swing 界面简洁美观,操作直观
-
修复经典边界BUG,程序健壮性高
-
可直接用于课程设计、作业提交、CSDN发布、学习演示
八、扩展方向(可二次开发)
-
增加校园地图绘制,可视化节点和路线
-
增加更多校园点位与道路
-
支持路径数据保存至本地文件
-
增加BFS、Floyd算法对比
-
美化界面、更换主题样式
结语
本项目完整实现了基于Dijkstra算法的校园最短路径导航,代码通俗易懂、适合初学数据结构与Java GUI的同学学习参考。需要项目报告、论文、运行截图、思维导图均可留言!