最短路径(Dijkstra算法和Floyd算法)

一、含义

  • 非网图的最短路径是两顶点之间经过的边数最少的路径;
  • 网图的最短路径是指两顶点之间经过的边上权值之和最少的路径,并且称路径上第一个顶点是源点,最后一个顶点是终点。

本文主要讲网图的最短路径。

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

迪杰斯特拉算法主要特点是以起始点为中心向外层层扩展,算出源点到每一个点的最短距离,直到扩展到终点为止。

代码示例:

//迪杰斯特拉
    private static void ShortestPath_Dijkstra(int v0){
        int v, min;
        int w;
        int[] end =new int[matrix.getVerNum()];    //顶点至该点的路径长度

        for(v = 0; v < matrix.getVerNum(); v++){
            end[v] = 0;
            Patharc[v] = 0;                     //初始化路径数组都为0
            ShortPathTable[v] = matrix.getArc()[v0][v];      //给v0相邻的点加上权值
        }

        ShortPathTable[v0] = 0;
        end[v0] = 1;

        for(v = 1; v < matrix.getVerNum(); v++){
            min = INFINITY;       //当前所知离v0顶点最近的距离
            for(w = 0; w < matrix.getVerNum(); w++){
                if(end[w] == 0 && ShortPathTable[w] < min){
                    k = w;
                    min = ShortPathTable[w];
                }
            }
            end[k] = 1;
            for (w = 0; w < matrix.getVerNum(); w++){
                if(end[w] == 0 && (min + matrix.getArc()[k][w] < ShortPathTable[w])){
                    ShortPathTable[w] = min + matrix.getArc()[k][w];
                    Patharc[w] = k;
                }
            }

        }

        System.out.println("最短路径为:"+ ShortPathTable[matrix.getVerNum()-1]);
    }

时间复杂度为O(n^2^)。

三、弗洛伊德(Floyd)算法

对于图的邻接矩阵D,假设D^1^矩阵中点v~2~对应的值为v~0~到v~2~的最短路径,满足下面的公式:

D^1^[v][w] = min{D[v][w],D[v][0]+D[0][w]}

以此类推,可以做出满足每个点出的值都等于其对应的最短路径的矩阵。

还可以做一个P矩阵存储最短路径。

代码如下:

    //Floyd算法
    private static void ShortestPath_Floyd(){
        int v,w,k;
        for (v = 0; v < matrix.getVerNum(); ++v){
            for (w = 0; w < matrix.getVerNum(); ++w){
                Pathmatirx[v][w] = w;
                ShortPathTable[v][w] = matrix.getArc()[v][w];
            }
        }

        for (k = 0; k < matrix.getVerNum(); ++k){
            for (v = 0; v < matrix.getVerNum(); ++v){
                for(w = 0; w < matrix.getVerNum(); ++w){
                    if(ShortPathTable[v][w] > ShortPathTable[v][k]+ShortPathTable[k][w]){
                        ShortPathTable[v][w] = ShortPathTable[v][k]+ShortPathTable[k][w];
                        Pathmatirx[v][w]=Pathmatirx[v][k];
                    }
                }
            }
        }

        System.out.println("最短路径为:"+ShortPathTable[0][matrix.getVerNum()-1]);
    }

时间复杂度为O(n^3^)。

本文用到的代码链接

你可能感兴趣的:(算法&数据结构)