我正在尝试为家庭作业实现BFS算法,我发现使用BFS的生成树算法,问题是我要求生成的生成树按预先排序。这是我的解决方案代码:
#include <stdio.h>
#include<iostream>
#include <vector>
#include <stdlib.h>
using namespace std;
#define MAX 10001
#include <queue>
int BFS_graph[MAX][MAX];
int followOrder [MAX];
queue<int> myQueue;
int visit[MAX];
int V, it, it2=0;
bool first;
int BFS_tree [ MAX ];
void bfs(int root){
int i, j,it2=0, node;
memset(visit, 0, sizeof(visit));
myQueue.push(root);
while(!myQueue.empty())
{
node = myQueue.front();
myQueue.pop();
if(visit[node]) continue;
visit[node] = 1;
// cout <<" "<<node;
BFS_tree[it2]=node;
it2++;
for(i=0; i<V; i++)
{
if( BFS_graph[i][node]) myQueue.push(i);
if( BFS_graph[node][i]) myQueue.push(i);
}
}
}
int main(int argc, char *argv []){
int origin ,destination, i, j, k;
int vertexNumber, EdgesNumber;
int initial;
memset(visit, 0, sizeof(visit));
cin>>vertexNumber>>EdgesNumber;
V=vertexNumber;
for (int j=0; j<EdgesNumber; j++){
cin>>origin>>destination;
BFS_graph[origin][destination]=1;
BFS_graph[destination][origin]=1;
}
for (int j=0; j<vertexNumber; j++)
cin>>followOrder[j];
first = true;
initial=followOrder[0];
bfs (initial);
for (int j=0; j<V; ++j)
cout<<BFS_tree[j]<<" ";
return 0;
}
输入:
10 10
0 1
0 3
1 3
0 2
4 1
4 5
6 4
7 2
8 7
7 9
0 1 2 3 4 5 6 7 8 9
我的算法产生输出: [0 1 2 3 4 7 5 6 8 9] 。通过打印每个级别的节点来表示BFS树,如下图所示:
但正确的输出(预购)应该是 [0 1 3 4 5 6 2 7 8 9] ,导致以预先的顺序遍历树。我需要一个解决方案,我的代码,如何修复我的代码,以显示预订的解决方案?,因为不必使用树,也就是说,某种程度上可以存储在我的数组BFS_tree树直接预订。我坚持这个。我读了一个类似的问题here,但我无法实施树木以提高效率,而且不允许这样做。我怎么能这样做?有可能吗?...请原谅我的英语。
答案 0 :(得分:0)
树的前序遍历包括在其子项之前处理每个父项。根据您遍历树的方式,您将获得不同的前序遍历。您显示的两个遍历都是树的正确的前序遍历。前者看起来像广泛的第一棵树之一,而后者看起来像深度第一搜索顺序。如果您应该作为广度优先搜索的结果创建后一个顺序,则需要将图表中的树结构指示为第一个路径,然后使用深度优先搜索处理该节点。