广度优先算法可以参考文章:
https://blog.csdn.net/weixin_40283843/article/details/130882463?spm=1001.2014.3001.5501
采用BFS算法求无权图的最短路径就是在BFS遍历算法中做一些小的修改就可以,代码如下:
int d[MAX_VERTEX_NUM]; //用来记录各个顶点到原始顶点最短路径长度
int path[MAX_VERTEX_NUM]; //每个顶点在最短路径中的直接前驱
bool visited[MAX_VERTEX_NUM];//用于标记顶点是否被访问过
// 求顶点u到其他顶点的最短路径
void BFS_MIN_Disrance(Graph g, int u)
{
for (int i = 0; i < g->vexnum; i++)
{
visited[i] = false; //初始化访问标记数组
d[i] = MAX_LENGTH; //初始化路径长度 该顶点到原始顶点最短路径长度
path[i] = -1; //初始化该顶点在最短路径中的直接前驱 记录
}
LinkQueue Q;
InitQueue(Q); //初始化辅助队列
int u_i = LocateVex(g, u); //找到顶点u所对应的数组下标
d[u_i] = 0; //u是原始顶点,因此d值应该为0
visited[u_i] = true;
EnQueue(Q, u);
while (!IsEmpty(Q))
{ //BFS算法主过程
DeQueue(Q, u); //队头元素出队并赋给u
for (int w = FirstNeighbor(g, u); w >= 0; w = NextNeighbor(g, u, w)) {
int w_i = LocateVex(g, w); //找到顶点w所对应的数组下标
if (!visited[w_i]) {
u_i = LocateVex(g, u);
d[w_i] = d[u_i] + 1; //路径长度加1
path[w_i] = u; //最短路径从u到w
visited[w_i] = true; //访问标记
EnQueue(Q, w); //顶点w入队
}
}
}
}
代码中其余函数请看给出的参考文章(比如找顶点所对应的数组下标等),测试数据也与其相同,对下图进行验证(来自王道考研视频)
其中开始顶点是2,即u = 2,运行结果如下: