第三十天算法设计

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

posted @   申shen  阅读(1)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
点击右上角即可分享
微信分享提示