最短路径详细解析(Dijkstra+Floyd)

最短路径是非常重要的算法,其中Floyd算法代码比较简单,但是时间复杂高;而Dijkstra算法比较快,然而比较复杂。
下面则通过实例更加理解其中的算法。

目录

  • Dijkstra
  • Folyd

Dijkstra

因为Dijsktra比较复杂,这里给出一些解释。分别引入了dist[],path[],set[],解释在图下。

本次算法以下图为例,其中上图已给出dist,path,set数组的正确值。
最短路径详细解析(Dijkstra+Floyd)_第1张图片
话不多说,直接放代码。

#include 

#define INFINITY 65525
using namespace std;

typedef struct{
     
    char vexs[100];
    int arc[100][100];
    int numVer,numEdges;
}MGraph;

void Creat(MGraph &g){
     
    int i,j,k,w;
    cout<<"输入顶点数和边数"<<endl;
    cin>>g.numVer>>g.numEdges;
    for(i=0;i<g.numVer;i++){
     
        cin>>g.vexs[i];
    }
    for(i=0;i<g.numVer;i++){
     
        for(j=0;j<g.numVer;j++){
     
            g.arc[i][j]=INFINITY;
        }
    }
    cout<<"请输入2个顶点数和权值"<<endl;
    for(k=0;k<g.numEdges;k++){
     
        cin>>i>>j>>w;
        g.arc[i][j]=w;
    }
}

int path[500];
int dist[500];
int set[500];

void Dijkstra(MGraph g,int v){
     
    int min,i,j,u;
    /*先进行初始化*/
    for(i=0;i<g.numVer;i++){
     
        dist[i]=g.arc[v][i];
        set[i]=0;
        if(g.arc[v][i]<INFINITY) path[i]=v;
        else path[i]=-1;
    }
    set[v]=1;path[v]=-1;
    for(i=0;i<g.numVer;i++){
     
        min=INFINITY;
        for(j=0;j<g.numVer;j++){
     
            if(set[j]==0&&dist[j]<min){
     
                u=j;
                min=dist[j];
            }
        }
        set[u]=1;
        for(j=0;j<g.numVer;j++){
     
            if(set[j]==0&&dist[u]+g.arc[u][j]<dist[j]){
     
                dist[j]=dist[u]+g.arc[u][j];
                path[j]=u;
            }
        }
    }
}

int main(){
     
    MGraph g;
    Creat(g);
    Dijkstra(g,0);
    for(int i=1;i<g.numVer;i++){
     
        cout<<dist[i]<<" ";
    }
    return 0;
}

下面是运行结果,可知与上图dist[]数组一致。
最短路径详细解析(Dijkstra+Floyd)_第2张图片

Folyd

因为Folyd比较简单,故不再进行解释,直接放图演示。
核心算法

				if(A[i][j]>A[i][k]+A[k][j]){
     
                    A[i][j]=A[i][k]+A[k][j];
                    Path[i][j]=k;
                }

最短路径详细解析(Dijkstra+Floyd)_第3张图片
代码

#include 

#define INFINITY 65525
using namespace std;

typedef struct{
     
    char vexs[100];
    int arc[100][100];
    int numVer,numEdges;
}MGraph;

void Creat(MGraph &g){
     
    int i,j,k,w;
    cout<<"输入顶点数和边数"<<endl;
    cin>>g.numVer>>g.numEdges;
    for(i=0;i<g.numVer;i++){
     
        cin>>g.vexs[i];
    }
    for(i=0;i<g.numVer;i++){
     
        for(j=0;j<g.numVer;j++){
     
            g.arc[i][j]=INFINITY;
        }
    }
    cout<<"请输入2个顶点数和权值"<<endl;
    for(k=0;k<g.numEdges;k++){
     
        cin>>i>>j>>w;
        g.arc[i][j]=w;
    }
}

int A[500][500];
int Path[500][500];

void Folyd(MGraph g){
     
    int i,j,k;
    for(i=0;i<g.numVer;i++){
     
        for(j=0;j<g.numVer;j++){
     
            A[i][j]=g.arc[i][j];
            Path[i][j]=-1;
        }
    }
    for(k=0;k<g.numVer;k++){
     
        for(i=0;i<g.numVer;i++){
     
            for(j=0;j<g.numVer;j++){
     
                if(A[i][j]>A[i][k]+A[k][j]){
     
                    A[i][j]=A[i][k]+A[k][j];
                    Path[i][j]=k;
                }
            }
        }
    }
}

int main(){
     
    MGraph g;
    Creat(g);
    Folyd(g);
    cout<<"最短路径矩阵图"<<endl;
    for(int i=0;i<g.numVer;i++){
     
        for(int j=0;j<g.numVer;j++){
     
            if(i==j) A[i][j]=0;
            cout<<A[i][j]<<" ";
        }
        cout<<endl;
    }
    return 0;
}

运行结果图
最短路径详细解析(Dijkstra+Floyd)_第4张图片

你可能感兴趣的:(数据结构,动态规划,算法,c++)