数据结构-图-最短路径(1)迪杰斯特拉算法构造

来源:互联网 发布:剑灵刺客捏脸数据图 编辑:程序博客网 时间:2024/06/06 00:25

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_DIJ(UNDGraph G,int v0);
bool S[MAXNUM];//记录v0到vi是否已被确定为最短路径,true/false 
int Path[MAXNUM];//记录v0是否可以到vi 
int D[MAXNUM];//记录最短路径 
int main(){
    UNDGraph G;
    cout << "---------创建邻接矩阵---------\n";
    create_adjacency_matrix(G);
    cout << "---------遍历邻接矩阵---------\n";
    ergodic_adjacency_matrix(G);;
    cout << "---------最短路径---------\n";
    char v0;
    cout << "请输入顶点数组中的任意一个顶点:";
    cin >> v0;
    short_path_DIJ(G,get_subscript(G,v0));
    for(int i = 0; i < G.vertex_num; i++) {
    if(v0 != G.vertex[i]) {
    cout << v0 << "到" << G.vertex[i] << "的最短路径为:" << D[i] << 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_DIJ(UNDGraph G,int v0){
int n = G.vertex_num;
for(int v = 0;v < n;v++) {
S[v] = false;
D[v] = G.adjacency_martrix[v0][v];
if(D[v] < MAXVALUE) {
Path[v] = v0;

else {
Path[v] = -1;
}
}
S[v0] = true;
D[v0] = 0;
int v;
for(int i = 1;i < n;i++) {
int min = MAXVALUE;
for(int w = 0;w < n;w++) {
if(!S[w] && D[w] < min) {
v = w;
min = D[w];
}
}
S[v] = true;
for(int w = 0;w < n;w++) {
if(!S[w] && (D[v] + G.adjacency_martrix[v][w]) < D[w]) {
D[w] = D[v] + G.adjacency_martrix[v][w];
Path[w] = v;
}
}
}


2.结果区


原创粉丝点击