//(基于邻接表实现,以有向图为例)
//DFS:Depth First Search 深度优先搜索
//1、访问起始顶点 2、访问一个未访问过的邻接顶点 3、若所有邻接顶点都已被访问,则回溯 4、所有顶点都被访问,遍历结束
void dfs(int start, bool visited[])
{
//访问起始结点
cout << verList[start].ver << '\t';
visited[start] = true;
//找到顶点表中该顶点对应的链表
edgeNode* node = verList[start].head;
while (node)
{
if (!visited[node]) dfs(visited[node],visited); //访问未访问过的邻接结点
node = node->next; //跳过已访问的结点
}
//当所有邻接结点都已被访问,则回溯
} //递归函数结束时,生成一棵深度优先搜索树
void dfs()
{
//访问标志数组初始化
bool* visited=new bool[Vers]; //Vers:顶点数量
for (int i = 0; i < Vers; i++)
Vers[i] = false;
for (int i = 0; i < Vers; i++)
{
if (visited[i] == true) continue; //寻找下一个树遍历的起始结点
dfs(i, visited);
} //生成深度优先搜索森林(起点选择不同,生成结果不同,有些情况能只生成一棵树)
}
//BFS:Breadth First Search 广度优先搜索
//1、访问起始顶点 2、依次访问起始顶点的所有未访问的邻接结点 3、所有顶点都被访问,遍历结束
void bfs()
{
queue<int> q;
bool* visited = new bool[Vers];
for (int i = 0; i < Vers; i++)
visited[i] = false;
for (int i = 0; i < Vers; i++)
{
if (visited[Vers] == true) continue; ///寻找一棵新的搜索树的起始结点
q.push(i); //结点入队,开始一棵搜索树的生成
while (!q.empty())
{
int currentNode = q.front();
q.pop();
if (visited[currentNode]) continue; //这里需要注意,比如1的邻接结点2、3入队,而3邻接于2,在访问3的过程中已访问了2,所以2出队时无需再次访问
cout << verList[currentNode].ver << '\t'; //访问当前结点
visited[currentNode] = true;
//找到顶点表中该顶点对应的链表
edgeNode* node = verList[currentNode].head;
//将未访问的邻接顶点入队
while (node)
{
if (!visited[node->end]) q.push(node->end); //将未访问的邻接顶点入队
node = node->next;
}
}
}
}