给一顶点V,求V到图中其它顶点的最短路径,若无路径存在,即为无穷。
注: 这里假定所有路径的权值均相同。
一、算法框架
int *BFS_Min_Distance(MGraph G, VertexType V) {//基于广度优先策略求顶点V到顶点i的最短路径
int dist[MaxVertexNum] = {INFINITY};//保存路径长度,初始化为无穷
dist[V] = 0;
visitFlag[V] = true;
Q.push(V);
while (!Q.empty()) {
V = Q.front();
Q.pop();
for (int i = 0; i < G.VertexNum; ++i) {
if (G.Edge[V][i] != INFINITY && visitFlag[i] == 0) {
dist[i] = dist[V] + 1;
visitFlag[i] = 1;
Q.push(i);
}
}
}
return dist;
}
二、具体实例
迷宫问题,用二维数组保存一个迷宫,求从起点S走到终点T的最小步数。
#include<iostream>
#include <queue>
using namespace std;
struct node {
int x;
int y;
int level;
} Node;
const int MAX = 20;
char Martix[MAX][MAX] = {{'.', '.', '.', '.', '.'},
{'.', '*', '.', '*', '.'},
{'.', '*', 'S', '*', '.'},
{'.', '*', '*', '*', '.'},
{'.', '.', '.', 'T', '*'}};
int m = 5, n = 5;//m行n列
bool inq[MAX][MAX] = {false};
int cnt = 0;
int X[4] = {0, 0, 1, -1};
int Y[4] = {1, -1, 0, 0};
queue<node> Q;
bool Judge(int x, int y) {
if (x < 0 || x >= m || y < 0 || y >= n) return false;
if (Martix[x][y] == '*') return false;
if (inq[x][y] == true) return false;
return true;
}
void BFS(int startX, int startY, int endX, int endY) {
Node.x = startX;
Node.y = startY;
Node.level = 0;
Q.push(Node);
inq[startX][startX] = true;
while (!Q.empty()) {
node temp = Q.front();
Q.pop();
if (temp.x == endX && temp.y == endY) {
cout << temp.level;
return;
}
for (int i = 0; i < 4; ++i) {
int NewX = temp.x + X[i];
int NewY = temp.y + Y[i];
if (Judge(NewX, NewY)) {
Node.x = NewX;
Node.y = NewY;
Node.level = temp.level + 1;
Q.push(Node);
inq[NewX][NewY] = true;
}
if (NewX == endX && NewY == endY)
break;
}
}
}
int main() {
for (int i = 0; i < 5; ++i) {
for (int j = 0; j < 5; ++j) {
cout << Martix[i][j] << " ";
}
cout << endl;
}
BFS(2, 2, 4, 3);
return 0;
}
广度优先遍历详见:https://blog.csdn.net/qq_43643944/article/details/117258085