数据结构-图-最短路径(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.结果区
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/04/0e591e5372b8c42a171fc5054cbda922)
/*
*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.结果区
相关文章推荐
- 最短路径(迪杰斯特拉算法)- 数据结构和算法64
- c语言实现求最短路径(迪杰斯特拉算法,《数据结构》算法7.15)
- C++代码,数据结构-最短路径(两种情况)(迪杰斯特拉算法和弗洛伊德算法)
- 最短路径(迪杰斯特拉算法)- 数据结构和算法64
- 数据结构之最短路径(Floyd)
- 数据结构之八皇后问题以及最短路径
- 【C# dijkstra迪杰斯特拉算法 最短路径】迪杰斯特拉算法 最短路径的C#实现
- 数据结构:最短路径算法之Bellman-Ford算法
- 数据结构 图 最短路径
- 单源最短路径:迪杰斯特拉算法
- 数据结构:最短路径(Dijkstra c++实现)
- 数据结构-最短路径
- 【图的最短路径】迪杰斯特拉算法求图的最短路径
- 迪杰斯特拉算法-最短路径
- 数据结构 — 图 之 MPT(最短路径 — dijkstra算法 )
- 迪杰斯特拉算法(dijkstra)——最短路径
- 图的应用---最短路径问题 用迪杰斯特拉算法解决 《地铁换乘问题》
- 【数据结构】最短路径——Dijkstra算法
- 最短路径(迪杰斯特拉算法-部分代码)
- 数据结构_队列_迷宫的最短路径