C++实现求多个结点之间的最短路径

本文介绍了一个C++实现的实验,目的是设计校园平面图并使用Dijkstra算法寻找任意两点间的最短路径。实验要求包括存储图信息、查询地点详情以及给出最短路径。代码包括CampusShortestPath.h和CampusShortestPath.cpp两个部分,用于实现图数据结构及最短路径计算功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实验要求

实验目的

  1. 实现图的存储和图的相关操作
  2. 利用Dijkstra算法求两点之间的最短路径

实验要求

  1. 设计校园平面图,至少包括10个以上的地点,每两个地点间可以有不同的路,且路长可能不同。以图中顶点表示校内各地点,存放名称、代号、简介等信息;用边表示路径,存放路径长度等相关信息。(要求使用真实地点及其位置)
    (1)提供图中任意地点相关信息的查询。
    (2)提供图中任意地点的问路查询,即查询任意两个地点之间的一条最短路径。
  2. 通过键盘输入图中顶点名称,查询图中任意一个顶点的相关信息
  3. 通过键盘输入起点名称和终点名称,输出最短路径

程序思路

  1. 定义顶点的数据格式
  2. 利用数组存储图额所有顶点
  3. 利用名称查询出数组中的顶点
  4. 输出顶点的相关信息

代码

CampusShortestPath.h

#pragma once
#define UNVISITED 0
#define VISITED 1
#include<iostream>
using namespace std;

//Edge class for Adjacency List graph representation
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构造函数*/
	Graphm(int numVert) {
   
    Init(numVert); }

	/*Graphm析构函数*/
	~Graphm() {
   
   
		delete[] mark;
		for (int i = 0; i < numVertex; i++) {
   
   
			delete[] matrix[i];
		}
		delete[] matrix;
	}

	/*Graphm初始化*/
	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];//Make matrix
		for (i = 0; i < numVertex; i++) matrix[i] = new double[numVertex];

		for (i = 0; i < numVertex; i++)//initialize to 0 weight
			for (int j = 0; j < numVertex; j++)
				matrix[i][j] = 0;
	}

	/*number of vertices*/
	int n() {
   
    return numVertex; }

	/*number of edges*/
	int e() {
   
    return numEdge; }

	/*return first neighbor of v*/
	int first(int v) {
   
   
		for (int i = 0; i < numVertex; i++) {
   
   
			if (matrix[v][i] != 0)	return i;
		}
		return numVertex;//return n if none
	}

	/* return v`s next neighbor after w */
	int next(int v, int w) {
   
   
		for (int i = w + 1; i < numVertex; i++) {
   
   
			if (matrix[v][i] != 0)	return i;
		}
		return numVertex;
	}

	/*Set edge(v1,v2) and edge(v2,v1)to wt*/
	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;
	}

	/*delete egde(v1,v2)*/
	void delEdge(int v1, int v2) {
   
   
		if (matrix[v1][v2] > 0)	numEdge -= 2;
		matrix[v2][v1] = matrix[v1][v2] = 0;
	}

	/*Is (v1,v2) an edge?*/
	bool isEdge(int v1, int v2) {
   
   
		
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值