大话数据结构
Unit6 图
邻接矩阵的最短路径Dijkstra算法
代码
#include <iostream>
typedef char VertexType;
typedef int EdgeType;
#define MAXVEX 100
#define INFINITY 65535
using namespace std;
int visited[100];
#define MAXVEX 9
#define INFINITY 65535
typedef int Pathmatrix[MAXVEX];
typedef int ShortPathTable[MAXVEX];
//构建顶点表
typedef struct {
VertexType vexs[MAXVEX]; //顶点数组
EdgeType arc[MAXVEX][MAXVEX]; //边的矩阵表示
int numVertexes, numEdges; //图中当前的顶点数和边数
}MGraph;
//创建邻接矩阵
void CreatMgraph(MGraph* G) {
int i, j, k, w;
cout << "输入顶点数和边数:" << endl;
cin >> G->numVertexes >> G->numEdges;
for (i = 0;i < G->numVertexes;i++) {
cout << "请输入顶点名:" << endl;
cin >> G->vexs[i];
}
//初始化邻接矩阵
for (i = 0;i < G->numVertexes;i++) {
for (j = 0;j < G->numVertexes;j++) {
G->arc[i][j] = INFINITY;
}
}
//构建邻接矩阵
for (k = 0;k < G->numEdges;k++) {
cout << "输入边(vi,vj)上的下标i,下标j和权w:" << endl;
cin >> i >> j >> w;
G->arc[i][j] = w;
G->arc[j][i] = G->arc[i][j];
}
}
//P[v]的值为前驱顶点下标,D[v]表示V0到v的最短路径长度和
void ShortestPath_Dijkstra(MGraph G, int v0, Pathmatrix* P, ShortPathTable* D) {
int v, w, k, min;
int final[MAXVEX];
for (v = 0;v < G.numVertexes;v++) {
final[v] = 0;
(*P)[v] = 0;
(*D)[v] = G.arc[v0][v];
}
(*D)[v0] = 0;
final[v0] = 1;
for (v = 1;v < G.numVertexes;v++) {
min = INFINITY;
for (w = 0;w < G.numVertexes;w++) {
if (!final[w] && (*D)[w] < min) {
k = w;
min = (*D)[w];
}
}
final[k] = 1;
for (w = 0;w < G.numVertexes;w++) {
if (!final[w] && (min + G.arc[k][w] < (*D)[w])) {
(*D)[w] = min + G.arc[k][w];
(*P)[w] = k;
}
}
}
}
int main() {
MGraph* grap = (MGraph*)malloc(sizeof(MGraph));
Pathmatrix* P = (Pathmatrix*)malloc(sizeof(Pathmatrix));
ShortPathTable* D = (ShortPathTable*)malloc(sizeof(ShortPathTable)); ;;
CreatMgraph(grap);
ShortestPath_Dijkstra(*grap,0,P,D);
free(grap);
grap = NULL;
return 0;
}
运行结果