6-3 最短路径(弗洛伊德算法)

Posted liuzijin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了6-3 最短路径(弗洛伊德算法)相关的知识,希望对你有一定的参考价值。

#include<iostream>
using namespace std;

#define MaxInt 32767
#define MVNum 100

typedef char VerTexType; 
typedef int ArcType;

int Path[MVNum][MVNum];    //标志两个结点之间是否可达
int D[MVNum][MVNum];//存储两个结点间的边的权重

typedef struct 
    VerTexType vexs[MVNum];//结点名称
    ArcType arcs[MVNum][MVNum];//边的位置
    int vexnum,arcnum; //结点个数,边的个数
AMGraph;

void CreateUDN(AMGraph& G) 
    cin >> G.vexnum;
    cin >> G.arcnum;

    for (int i = 0; i < G.vexnum; i++) 
        cin >> G.vexs[i];//输入各个结点各自的名称(字符类型)
    

    for (int i = 0; i < G.vexnum; i++) 
        for (int j = 0; j < G.vexnum; j++) 
            G.arcs[i][j] = MaxInt;//初始化各条边,初始化为不可达
        
    

    for (int k = 0; k < G.arcnum; k++) //创建有向邻接矩阵
        int i, j, w;
        cin >> i >> j >> w;
        G.arcs[i][j] = w;
    



void ShortestPath_Floyed(AMGraph G) //最短路径核心算法--弗洛伊德算法
    for (int i = 0; i < G.vexnum; i++) 
        for (int j = 0; j < G.vexnum; j++) 
            D[i][j] = G.arcs[i][j];
            if (i != j && G.arcs[i][j] < MaxInt) 
                Path[i][j] = i;//标志为其正经权重
             else 
                Path[i][j] = -1;//标志位不可达
            
        
    

    for (int k = 0; k < G.vexnum; k++) 
        for (int i = 0; i < G.vexnum; i++) 
            for (int j = 0; j < G.vexnum; j++) 
                if (D[i][k] + D[k][j] < D[i][j]) //找寻最短路径
                    D[i][j] = D[i][k] + D[k][j];//更换最短路径
                    Path[i][j] = Path[k][j];//更换对应标志
                
            
        
    



int LocateVex(AMGraph G, VerTexType v) //定位某个结点的位置
    for (int i = 0; i < G.vexnum; i++) 
        if (G.vexs[i] == v) 
            return i;
        
    
    return -1;  


void DisplayPath(AMGraph G , int begin ,int temp )//输出相应的运行结果
    if(Path[begin][temp] != -1)
        DisplayPath(G , begin ,Path[begin][temp]);
        cout << G.vexs[Path[begin][temp]] << "->";
    



int main()
   AMGraph G;
    char start , destination;
    int num_start , num_destination;
    CreateUDN(G);
    ShortestPath_Floyed(G);
    cin >> start >> destination;//输入源点和终点
    num_start = LocateVex(G , start);
    num_destination = LocateVex(G , destination);
    DisplayPath(G , num_start , num_destination);//利用迭代算法寻找源点和终点的最短路径
    cout << G.vexs[num_destination]<<endl;
    cout << D[num_start][num_destination];
    return 0;


以上是关于6-3 最短路径(弗洛伊德算法)的主要内容,如果未能解决你的问题,请参考以下文章

图(最短路径算法————迪杰斯特拉算法和弗洛伊德算法).RP

【数据结构】最短路径之迪杰斯特拉(Dijkstra)算法与弗洛伊德(Floyd)算法

算法弗洛伊德算法 最短路径算法

最短路径算法——清晰简单的弗洛伊德算法(Floyd)

数据结构 图 最短路径问题 迪杰斯特拉算法和弗洛伊德算法问题

最短路径算法专题1----弗洛伊德