介绍
广搜BFS思路实现的
主要通过一个结构体和一个临时队列
typedef struct _INFO
{
int nVertex;
bool bVisit;
int nDist;
int nPath;
}INFO, *PINFO;
nVertex: 顶点索引
bVisit: 是否访问过
nDist: 步数
nPath: 上一个
Demo
typedef struct _INFO
{
int nVertex;
bool bVisit;
int nDist;
int nPath;
}INFO, *PINFO;
bool BFS(PGRAPH pGraph, char chBegin, char chEnd)
{
//获取起始索引、结束索引
int nBeginIndex = -1;
int nEndIndex = -1;
for (int i = 0; i < pGraph->vn; i++)
{
if (pGraph->vertex[i] == chBegin)
{
nBeginIndex = i;
}
else if (pGraph->vertex[i] == chEnd)
{
nEndIndex = i;
}
if (nBeginIndex != -1 && nEndIndex != -1)
{
break;
}
}
if (nBeginIndex == -1 || nEndIndex == -1)
{
return false;
}
INFO info[100] = { 0 };
info[nBeginIndex].nVertex = nBeginIndex;
info[nBeginIndex].bVisit = true;
info[nBeginIndex].nDist = 0;
info[nBeginIndex].nPath = nBeginIndex;
//临时队列
std::queue<int> q;
q.push(nBeginIndex);
while (q.empty() == false)
{
//出队
int x = q.front();
q.pop();
//遍历该节点指向的其他节点
for (int i = 0; i < pGraph->vn; i++)
{
//判断是否指向该节点
if (pGraph->edge[x][i] == false)
{
continue;
}
//指向
//判断是否已搜索过
if (info[i].bVisit == true)
{
//访问过
//判断覆盖是否大于或等于
if (info[x].nDist + 1 > info[i].nDist)
{
//大于或等于就没必要覆盖了
continue;
}
}
q.push(i);
//未访问过
info[i].nVertex = i;
info[i].bVisit = true;
info[i].nDist = info[x].nDist + 1;
info[i].nPath = x;
}
}
//这里就是按顺序打印了
std::stack<int> st;
for (int i = nEndIndex; ; i = info[i].nPath)
{
st.push(info[i].nVertex);
if (i == nBeginIndex)
{
break;
}
}
while (st.empty() == false)
{
std::cout << pGraph->vertex[st.top()] << " ";
st.pop();
}
std::cout << std::endl;
return true;
}
调用
BFS(pGraph, 'a', 'b');
具体代码可看上一节: 数据结构-无权无向图.