Pj2 最短路

使用方法

默认地图

在这里插入图片描述
说明:

  • 线段表示路径数字表示这两地点间的距离
  • 图中两个单向箭头代表:在这两条路径上,自行车只能单向通行,如:从 四教宿舍区正门 可以骑行,而从 宿舍区正门四教 只能步行。
  • 步行速度为1,骑行速度为1.5

步行

在这里插入图片描述


骑行

在这里插入图片描述
说明: 因为从 宿舍区正门二教,自行车只能单向通行,所以需要绕路前往。


综合

在这里插入图片描述
说明: 因为从 宿舍区正门二教,自行车只能单向通行,绕路前往所花时间长于步行直接前往,所以选择这条路线。


自定义地图

在这里插入图片描述
说明:

  • 需要输入顶点数边数地点名称各边的距离各方向是否可以骑行
  • 图中情况:不存在到达路线,报错。

实现方法

类:

class Graph{
	public:
		void Initial(int transp);  //初始化,给定地图 
		void Create(int transp);   //自行创建地图 
		int VexNum(VType v);       //查找地图中的地点,并返回对应下标,未找到则返回-1
		int Adj1(int v);           //第一次更新 
		int Adj2(int v, int w);    //再一次更新 
		void Dijkstra(VType sp, VType ed, int transp);   //Dijkstra算法
		 
	private:
		VType vexs[VM];       //顶点名称    
		double arcs[VM][VM];  //邻接矩阵,二维数组记录权
		int flag[VM][VM];     //记录交通工具    
		int vexnum, arcnum;   //顶点数和边数
		vector< queue<VType> >path;   //记录最短路径的地点 
		double dist[VM];      //最短路径距离 
		bool exist[VM];       //是否存在最短路径
};

通过邻接矩阵表示有向图,算法复杂度:O(n²)

	//数组初始化 
	for(int i = 0; i < 12; i++){
		for(int j = 0; j < 12; j++){
			this->arcs[i][j] = INF;  //arcs初始状态距离为INF 
		}
	}

通过Dijkstra算法找到最短路

	for(i = 0; i < this->vexnum; i++){   //通过Dijkstra算法寻找最短路 
		double dismin = INF;
		int v = i;
		for(j = 0; j < this->vexnum; j++){   //在没有确定最短路中的所有点找出距离最短的那个点
			if(!exist[j] && dist[j] < dismin){
				dismin = dist[j];
				v = j;
			}
			exist[v] = true;
			int w = this->Adj1(v);   //更新其他点的最短距离
			while(w != -1){
				double vx;
				vx = dist[v] + this->arcs[v][w];
				if(vx < dist[w]){
					dist[w] = vx;
					path[w] = path[v];
					path[w].push(vexs[w]);
				}
				w = this->Adj2(v,w);
			}
		}
	}

仍存在的不足

交通方式太少:只有 步行 和 骑行。后续可以再加入 驾车 和 固定线路的公共交通。
顶点和边太少,只能用于固定的几个地点,不够精确。

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值