使用方法
默认地图
说明:
- 线段表示路径,数字表示这两地点间的距离。
- 图中两个单向箭头代表:在这两条路径上,自行车只能单向通行,如:从 四教 到 宿舍区正门 可以骑行,而从 宿舍区正门 到 四教 只能步行。
- 步行速度为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);
}
}
}
仍存在的不足
交通方式太少:只有 步行 和 骑行。后续可以再加入 驾车 和 固定线路的公共交通。
顶点和边太少,只能用于固定的几个地点,不够精确。