最短路径算法

本文详细介绍了弗洛伊德算法用于计算图中所有顶点间的最短路径,以及迪杰斯特拉算法求解单一源点到其他各顶点最短路径的方法。文中提供了具体的实现代码,并解释了初始化矩阵及更新过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、弗洛伊德(Floyd)算法

可以求出所有点之间的最短路径

public final int INFILITY=1000;// 无穷远
    public  final int N=35;// N是图中顶点的个数
    public  int[][] distance=new int[N][N];
    public  int[][] path=new int[N][N];
    // distance是邻接矩阵
    // path[i][j]表示i到j的最短路径上j的前驱结点
// 初始化path矩阵
        int i,j,k;
        for(i=0;i<N;++i){
            for(j=0;j<N;++j)
                path[i][j]=i;//
        }
        // Floyd算法
        for (k = 0; k < N; ++k)
            for (i = 0; i < N; ++i) 
                for (j = 0; j < N; ++j)
                    if(distance[i][j]>distance[i][k]+distance[k][j]){
                        // 有更短的路径
                        distance[i][j]=distance[i][k]+distance[k][j];
                        path[i][j]=path[k][j];
                    }

需要注意,在初始化path矩阵的时候,
1.如果将path初始化为j

path[i][j]=j;

则在Floyd算法中更新path的时候要这样更新:

path[i][j]=path[i][k];

2.如果这样初始化path

path[i][j]=i;

则需要这样更新:

path[i][j]=path[k][j];

二、迪杰斯特拉(Dijkstra)算法

求某个点到其它结点的最短路径

    public static class Graph{
        public String[] vertexs;// 顶点数组
        public int[][] edges;// 邻接矩阵
        public int vertexNum,edgeNum;// 顶点和边的数目
    }
    public static int INFILITY = 1000;// 无穷远
    public int[] path = new int[vertexNum];// 起点到其他结点的最短路径上的前驱结点
    public int[] dis = new int[vertexNum];// 起点到其他结点的最短距离
public void dijkstra(int start) {

        boolean[] visited = new boolean[vertexNum];

        int i, j, k, minDis, minIdx = 0;
        // 初始化
        for (i = 0; i < vertexNum; ++i) {
            dis[i] = edges[start][i];// dis初始为权值
            path[i] = 0;// path初始为0
        }
        // 主循环,执行N-1次
        for (k = 1; k < vertexNum; ++k) {
            minDis = INFILITY;
            // 找与起点最近的没找到最短路径的结点
            for (j = 0; j < vertexNum; ++j) {
                if (!visited[j] && dis[j] < minDis) {
                    minDis = dis[j];
                    minIdx = j;
                }
            }
            visited[minIdx] = true;// 找到了一个最近邻居
            // 遍历所有未找到最短路径的结点,更新最短路径
            for (j = 0; j < vertexNum; ++j) {
                // 如果从起点到j的当前距离大于从起点经过minIdx到j的距离,那么最短路径应当经过minIdx
                if (!visited[j] && (dis[j] > minDis + edges[minIdx][j])) {
                    dis[j] = minDis + edges[minIdx][j];
                    path[j] = minIdx;
                }
            }
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值