数据结构-图-最短路径(2)弗洛伊德算法构造

来源:互联网 发布:qq for mac远程协助 编辑:程序博客网 时间:2024/06/07 02:57

1.代码区

/*

 *Date: 17-12-03
 *Author: Qian_Yu
 *Program: 费罗伊德算法求最短路径 
 */
#include <bits/stdc++.h>
#define MAXVALUE 0x7FFF
#define MAXNUM 0x64
using namespace std;
typedef struct adj_node{
    char vertex[MAXNUM];
    int adjacency_martrix[MAXNUM][MAXNUM];
    int vertex_num,edge_num;
} UNDGraph;
void create_adjacency_matrix(UNDGraph &G);
int get_subscript(UNDGraph G,char v);
void ergodic_adjacency_matrix(UNDGraph G);
void short_path_FLOYD(UNDGraph G);
int Path[MAXNUM][MAXNUM];//记录上一顶点序号 
int D[MAXNUM][MAXNUM];//记录vi与vj直接最短路径长度 
int main(){
    UNDGraph G;
    cout << "---------创建邻接矩阵---------\n";
    create_adjacency_matrix(G);
    cout << "---------遍历邻接矩阵---------\n";
    ergodic_adjacency_matrix(G);;
    cout << "---------最短路径---------\n";
    short_path_FLOYD(G);
    for(int i = 0; i < G.vertex_num; i++) {
    for(int j = 0; j < G.vertex_num; j++) {
    if(i != j) {
    cout << G.vertex[i] << "到" << G.vertex[j] << "最短路径为:" << D[i][j] << endl; 
}
}
}
    return 0;
}
void create_adjacency_matrix(UNDGraph &G){
    cout << "请输入顶点数(int),边数(int):";
    cin >> G.vertex_num >> G.edge_num;
    cout << "请输入顶点信息(char):";
    for(int i = 0;i < G.vertex_num;i++) {
        cin >> G.vertex[i];
    }
    for(int i = 0;i < G.vertex_num;i++) {
        for(int j = 0;j < G.vertex_num;j++) {
            G.adjacency_martrix[i][j] = MAXVALUE;
        }
    }
    char v1,v2;
    int w;
    cout << "请输入顶点对V1(char),V2(char):\n";
    for(int k = 0;k < G.edge_num;k++) {
        cin >> v1 >> v2 >> w;
        int i = get_subscript(G,v1);
        int j = get_subscript(G,v2);
        G.adjacency_martrix[i][j] = w;
    }
}
int get_subscript(UNDGraph G,char v){
    for(int i = 0;i < G.vertex_num;i++) {
        if(G.vertex[i] == v) {
            return i;
        }
    }
    return -1;
}
void ergodic_adjacency_matrix(UNDGraph G){
    for(int i = 0; i < G.vertex_num; i++) {
        for(int j = 0; j < G.vertex_num; j++) {
            printf(j == 0?"%d":"\t%d",G.adjacency_martrix[i][j]);
        }
        cout << endl;
    }
}
void short_path_FLOYD(UNDGraph G){
for(int i = 0; i < G.vertex_num; i++) {
for(int j = 0; j < G.vertex_num; j++) {
D[i][j] = G.adjacency_martrix[i][j];
if(D[i][j] < MAXVALUE && i != j) {
Path[i][j] = i;
}
else {
Path[i][j] = -1;
}
}
}
for(int k = 0; k < G.vertex_num; k++) {
for(int i = 0; i < G.vertex_num; i++) {
for(int j = 0; j < G.vertex_num; 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];
}
}
}
}


2.结果区


原创粉丝点击