DijkStraアルゴリズムがキャンパスマップナビゲーションを実現

最短経路を解くためのダイクストラのアルゴリズムの基本的な考え方:

(1)補助配列Distを設定します。各コンポーネントDist [k]は、現在ソースポイントから残りの頂点kまでに取得された最短パスを表します。

(2)一般に、Dist [k] = Min {<ソースポイントから頂点kまでの円弧の重み>、<ソースポイントから他の頂点までの最短パス長> + <他の頂点から頂点kまでの円弧上のアーク>重量>};

(3)最初に、すべてのポイントのラベルをクリアします。

(4)d [0] = 0、他のd [i] = infを設定します。

(5)すべてのラベル付けされていないノード間でn回ループし、d値が最小のノードxを選択し、ノードxにマークを付けます。 min {d [y]、d [x] + w(x、y)}。

アルゴリズムの実装

  1. 地図を作成する
    ここに画像の説明を挿入

  2. コンソールで、マップを次のように抽象化します
    ここに画像の説明を挿入

  3. 設計要件と実際のニーズに従って定義されたマクロは次のとおりです

#define M 8//地点数 
#define N 12//路径数 
#define mapRowNum 10//地图行数
#define mapColNum 10//地图列数
  1. マップの2次元配列を定義する
//地图二维数组 
static char map[mapRowNum][mapRowNum] = {
    
    
	{
    
    ' ', ' ', ' ', ' ', '0', '*', ' ', ' ', ' ', ' '},
	{
    
    ' ', ' ', ' ', '*', '*', ' ', '1', ' ', ' ', ' '},
	{
    
    ' ', ' ', '*', ' ', '2', '*', ' ', '*', ' ', ' '},
	{
    
    ' ', '*', ' ', ' ', '*', ' ', ' ', ' ', '*', ' '},
	{
    
    '*', ' ', ' ', '*', '3', '*', ' ', ' ', ' ', '*'},
	{
    
    '*', ' ', '*', ' ', '*', ' ', '*', ' ', ' ', '*'},
	{
    
    '4', '*', ' ', ' ', '*', ' ', ' ', '*', '*', '6'},
	{
    
    ' ', ' ', '*', '*', '5', '*', '*', ' ', ' ', ' '},
	{
    
    ' ', ' ', ' ', ' ', '*', ' ', ' ', ' ', ' ', ' '},
	{
    
    ' ', ' ', ' ', ' ', '7', ' ', ' ', ' ', ' ', ' '},
};
  1. 隣接する2点間の距離の配列を定義します
//相邻两点间的距离数组 
static int dist[3][12] = {
    
    
	{
    
    0, 0, 0, 1, 1, 2, 3, 3, 3, 4, 5, 5},
	{
    
    1, 2, 4, 2, 6, 3, 4, 5, 6, 5, 6, 7},
	{
    
    3, 2, 12, 3, 10, 2, 9, 4, 11, 7, 9, 2}
};
  1. 場所名の配列を定義する
//地点名 
static char loca[8][8] = {
    
    "图书馆", "行远楼", "信南", "四区", "东操", "餐厅", "北操", "宿舍区"};
  1. 他の配列を定義する
int edge[N][N], weight[N], disp[N];
bool visited[N] = {
    
    false};
const int inf = 999999;
  1. マップと凡例を印刷するための関数
//打印地图和图例 
void printMap() {
    
    
	printf("  ");
	for(int i = 0; i < mapRowNum; i++) {
    
    
		for(int j = 0; j < mapColNum; j++) {
    
    
			printf("%c ", map[i][j]);
		}
		printf("\n  ");
	}
	printf("\n");
	printf("图例:(共8个地点)\n  0-图书馆  1-行远楼  2-信南  3-四区");
	printf("  4-东操  5-餐厅  6-北操  7-宿舍区\n\n");
	printf("各地点间距离:(任意两点间共12条路径)\n  ");
	printf("0-1:3;  0-2:2;  0-4:12;  1-2:3;  1-6:10;  2-3:2;  ");
	printf("3-4:9;  3-5:4;  3-6:11;  4-5:7;  5-6:9;  5-7:2 ");
}
  1. 最短経路を解決する機能
//求解最短路径 
void calculatePath(){
    
    
	int prev[N];//用来标注当前结点的上一个结点,以便输出两点间最短路线
	fill(edge[0], edge[0] + N * N, inf);//注意这里要是N*N,要不然不是全部
	fill(disp, disp + N, inf);
	
	int start_point;
	cout<<"\n\n请输入起点:";
	cin>>start_point;
	
	//建立二维距离矩阵 
	for(int i=0; i < N; i++) {
    
    
		edge[dist[0][i]][dist[1][i]] = edge[dist[1][i]][dist[0][i]] = dist[2][i];
	}

	for(int i = 0; i < N; i++) {
    
    
		prev[i] = i;//初始状态设每个点的前驱为自身
		edge[i][i] = 0;
	}
	
	//DijkStra算法求解最短路径 
	disp[start_point] = 0;
	for(int i = 0; i < M; i++) {
    
    
		int u = -1, min = inf;
		for(int j = 0; j < M; j++) {
    
    
			if(visited[j] == false && disp[j] <= min) {
    
    
				u = j;
				min = disp[j];
			}
		}
		if(u == -1)    break;
		visited[u] = true;
		for(int v = 0; v < M; v++) {
    
    
			if(visited[v] == false && edge[u][v] != inf) {
    
    
				if(disp[u] + edge[u][v] < disp[v]) {
    
    
					disp[v] = disp[u] + edge[u][v];
					prev[v] = u;//prev保存当前结点的上一个节点,以便输出最短路线
				}
			}
		}
	}

	int end_point;//终点
	cout<<"请输入终点:";
	cin>>end_point;
	
	stack<int> myStack;//最短路径栈 

	//构建最短路径栈 
	int temp = end_point;
	myStack.push(end_point);//先加终点
	while(start_point != temp) {
    
    
		temp = prev[temp];
		myStack.push(temp);//注意这里是把当前点的上一个结点放进去,此时换成了temp
	}

	cout<<"\n"<<loca[start_point]<<"("<<start_point<<")"<<" -> "<<loca[end_point];
	cout<<"("<<end_point<<")"<<"的最短距离为: "<<disp[end_point]<< "\n对应的路径为:    ";
	
	//输出最短路径 
	while(!myStack.empty()) {
    
    
		cout<<loca[myStack.top()]<<"("<<myStack.top()<<")";
		myStack.pop();
		if(!myStack.empty())
			cout<<"->";
	}
} 
  1. 主な機能
#include <iostream>
#include <algorithm>
#include <stack>
using namespace std;
int main() {
    
    
	printMap();
	calculatePath();
	return 0;
}

演算結果

ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/qq_43405938/article/details/108692568