【数据结构】最短路径——Floyd算法

一.问题描述

给定带权有向图G=(V,E),对任意顶点$v_i,v_j$ $\in$V (i$\neq$j),求顶点$v_i$到顶点$v_j$的最短路径。

转化为:

多源点最短路径求解问题

解决方案一:

每次以一个顶点为源点调用Dijksra算法。时间复杂度为O($n^3$)

解决方法二:

Floyd算法

二.弗洛伊德算法的基本思想

        对于从$v_i$$v_j$的弧,进行n次试探:首先考虑路径$v_i,v_0,v_j$是否存在,如果存在,则比较$v_i,v_j$$v_i,v_0,v_j$的路径长度,取较短者为从$v_i$$v_j$的中间顶点的序号不大于0的最短路径。在路径上再增加一个顶点$v_1$,以此类推,在经过n次比较后,最后求得从顶点$v_i$$v_j$得最短路径。

三.弗洛伊德算法的实现

#include 
#include 
#include 
using namespace std;

const int MAX_VERTEX=10;

//带权(邻接矩阵)有向图
class MGraph{
private:
    int arc[MAX_VERTEX][MAX_VERTEX];//邻接矩阵
    int vertex[MAX_VERTEX];//存储每个结点的信息
    int vertexNum,arcNum;//实际顶点个数,边的条数
public:
    MGraph(int n,int e);
    void Dijkstra(int start);
    int findMinDist(int dist[],int s[]);
    void display();
    void displayPath(int dist[],int path[],int start,int min);
    void Floyd();
    char* string_concatenation(char *s1,char *s2);
};
int main(int argc, const char * argv[]) {
    MGraph G(5, 7);
    G.display();
    G.Floyd();
    //G.Dijkstra(0);
    //ALGraph G(7, 10);
    //G.topology();
    return 0;
}
MGraph::MGraph(int n,int e){
    int p,q,w;
    vertexNum=n;
    arcNum=e;
    for(int i=0;i>p>>q>>w;
        arc[p][q]=w;
    }
}
void MGraph::Floyd(){
    int dist[vertexNum][vertexNum],i,j,k;
    char* path[vertexNum][vertexNum];
    
    for(i=0;idist[i][k]+dist[k][j]||dist[i][j]==-1){
                        dist[i][j]=dist[i][k]+dist[k][j];
                        delete [] path[i][j];
                        path[i][j]=string_concatenation(path[i][k], path[k][j]);
                    }
                }
            }
        }
    }
    for(i=0;i

 

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