您的位置:首页 > 理论基础 > 数据结构算法

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

2017-12-03 23:57 393 查看
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.结果区




内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息