第三十天算法设计
Graph 类 (图的最短路径:Dijkstra 算法)
java
package suanfa;
import java.util.Arrays;
public class Graph {
private int vertices; // 图的顶点数
private int[][] adjacencyMatrix; // 邻接矩阵
// 构造函数,初始化图
public Graph(int vertices) {
this.vertices = vertices;
adjacencyMatrix = new int[vertices][vertices]; // 创建邻接矩阵
for (int i = 0; i < vertices; i++) {
Arrays.fill(adjacencyMatrix[i], Integer.MAX_VALUE); // 初始化为无穷大
}
}
// 向图中添加一条边
public void addEdge(int start, int end, int weight) {
if (start >= 0 && start < vertices && end >= 0 && end < vertices) {
adjacencyMatrix[start][end] = weight; // 设置边的权重
adjacencyMatrix[end][start] = weight; // 如果是无向图
} else {
System.out.println("输入的边的端点无效");
}
}
// Dijkstra 最短路径算法
public void dijkstra(int start) {
int[] dist = new int[vertices]; // 保存最短路径
boolean[] visited = new boolean[vertices]; // 记录哪些顶点已被访问
// 初始化所有距离为无穷大,起始点的距离为 0
Arrays.fill(dist, Integer.MAX_VALUE);
dist[start] = 0;
// 查找最短路径
for (int i = 0; i < vertices; i++) {
// 选择未访问的、距离起点最近的节点
int u = minDistance(dist, visited);
visited[u] = true;
// 更新与当前节点相邻的未访问节点的距离
for (int v = 0; v < vertices; v++) {
if (!visited[v] && adjacencyMatrix[u][v] != Integer.MAX_VALUE &&
dist[u] != Integer.MAX_VALUE && dist[u] + adjacencyMatrix[u][v] < dist[v]) {
dist[v] = dist[u] + adjacencyMatrix[u][v];
}
}
}
// 输出最短路径
printSolution(dist);
}
// 查找最小距离的节点
private int minDistance(int[] dist, boolean[] visited) {
int min = Integer.MAX_VALUE, minIndex = -1;
for (int v = 0; v < vertices; v++) {
if (!visited[v] && dist[v] <= min) {
min = dist[v];
minIndex = v;
}
}
return minIndex;
}
// 打印最短路径
private void printSolution(int[] dist) {
System.out.println("顶点 \t 距离从源点的最短距离");
for (int i = 0; i < vertices; i++) {
System.out.println(i + " \t " + dist[i]);
}
}
public static void main(String[] args) {
// 创建一个图,图中有5个顶点
Graph graph = new Graph(5);
// 添加一些边及其权重
graph.addEdge(0, 1, 10);
graph.addEdge(0, 4, 5);
graph.addEdge(1, 2, 1);
graph.addEdge(1, 4, 2);
graph.addEdge(2, 3, 4);
graph.addEdge(3, 4, 9);
// 执行 Dijkstra 最短路径算法,从顶点0开始
System.out.println("Dijkstra算法的最短路径结果:");
graph.dijkstra(0);
}
}
录制: untitled2 – Insertion.java
录制文件:https://meeting.tencent.com/crm/KzGGkGE85d
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本