实验要求
实验目的
- 实现图的存储和图的相关操作
- 利用Dijkstra算法求两点之间的最短路径
实验要求
- 设计校园平面图,至少包括10个以上的地点,每两个地点间可以有不同的路,且路长可能不同。以图中顶点表示校内各地点,存放名称、代号、简介等信息;用边表示路径,存放路径长度等相关信息。(要求使用真实地点及其位置)
(1)提供图中任意地点相关信息的查询。
(2)提供图中任意地点的问路查询,即查询任意两个地点之间的一条最短路径。
- 通过键盘输入图中顶点名称,查询图中任意一个顶点的相关信息
- 通过键盘输入起点名称和终点名称,输出最短路径
程序思路
- 定义顶点的数据格式
- 利用数组存储图额所有顶点
- 利用名称查询出数组中的顶点
- 输出顶点的相关信息
代码
CampusShortestPath.h
#pragma once
#define UNVISITED 0
#define VISITED 1
#include<iostream>
using namespace std;
class Edge {
int vert;
double wt;
public:
Edge() {
vert = -1;
wt = -1;
}
Edge(int v, double w) {
vert = v;
wt = w;
}
int vertex() {
return vert; }
double weight() {
return wt; }
};
class Graphm {
private:
double** matrix;
int numVertex;
int numEdge;
int* mark;
public:
Graphm(int numVert) {
Init(numVert); }
~Graphm() {
delete[] mark;
for (int i = 0; i < numVertex; i++) {
delete[] matrix[i];
}
delete[] matrix;
}
void Init(int n) {
int i;
numVertex = n;
numEdge = 0;
mark = new int[numVertex];
for (i = 0; i < numVertex; i++) mark[i] = UNVISITED;
matrix = (double**)new double*[numVertex];
for (i = 0; i < numVertex; i++) matrix[i] = new double[numVertex];
for (i = 0; i < numVertex; i++)
for (int j = 0; j < numVertex; j++)
matrix[i][j] = 0;
}
int n() {
return numVertex; }
int e() {
return numEdge; }
int first(int v) {
for (int i = 0; i < numVertex; i++) {
if (matrix[v][i] != 0) return i;
}
return numVertex;
}
int next(int v, int w) {
for (int i = w + 1; i < numVertex; i++) {
if (matrix[v][i] != 0) return i;
}
return numVertex;
}
void setEgde(int v1, int v2, double wt) {
if (wt < 0) {
cout << "权重值需大于0!";
return;
}
if (matrix[v1][v2] == 0) numEdge += 2;
matrix[v2][v1] = matrix[v1][v2] = wt;
}
void delEdge(int v1, int v2) {
if (matrix[v1][v2] > 0) numEdge -= 2;
matrix[v2][v1] = matrix[v1][v2] = 0;
}
bool isEdge(int v1, int v2) {