从图中某个顶点v出发,在访问了v之后依次访问v的各个未曾访问过的邻接点,然后分别从这些邻接点出发依次访问它们的邻接点。并使得“先被访问的顶点的邻接点先于后被访问的顶点的邻接点被访问”,直至图中所有已被访问的顶点的邻接点都被访问到。如果此时图中尚有顶点未被访问,则需要另选一个未曾被访问过的顶点作为新的起始点,重复上述过程,直至图中所有顶点都被访问到为止。
正确代码为:
#include<queue>
#include<vector>
struct GraphNode
{
int label;
std::vector<GraphNode*> neighbors;
GraphNode(int x) : label(x) {};
};
void BFS_graph(GraphNode * node, int visit[])
{
std::queue<GraphNode*> Q;
Q.push(node);
visit[node->label]= 1;
while (!Q.empty())
{
GraphNode* node = Q.front();
Q.pop();
printf("%d ",node->label);
for (int i = 0; i <node->neighbors.size(); i++)
{
if (visit[node->neighbors[i]->label]==0)
{
Q.push(node->neighbors[i]);
visit[node->neighbors[i]->label] = 1;
}
}
}
}
int main()
{
const int MAX_N = 5;
GraphNode* Graph[MAX_N];
for (int i = 0; i <MAX_N; i++)
{
Graph[i] = new GraphNode(i);
}
Graph[0]->neighbors.push_back(Graph[4]);
Graph[0]->neighbors.push_back(Graph[2]);
Graph[1]->neighbors.push_back(Graph[0]);
Graph[1]->neighbors.push_back(Graph[2]);
Graph[2]->neighbors.push_back(Graph[3]);
Graph[3]->neighbors.push_back(Graph[4]);
Graph[4]->neighbors.push_back(Graph[3]);
int visit[MAX_N] = {0};
for (int i = 0; i < MAX_N; i++)
{
if (visit[i]==0)
{
printf("From label (%d)", Graph[i]->label);
BFS_graph(Graph[i],visit);
}
printf("\n");
}
return 0;
}
运行结果为:
From label (0)0 4 2 3
From label (1)1
容易写错成为:
#include<queue>
#include<vector>
struct GraphNode
{
int label;
std::vector<GraphNode*> neighbors;
GraphNode(int x) : label(x) {};
};
void BFS_graph(GraphNode* node, int visit[])
{
std::queue<GraphNode*> Q;
Q.push(node);
while (!Q.empty())
{
GraphNode* node = Q.front();
Q.pop();
printf("%d ", node->label);
visit[node->label] = 1;
for (int i = 0; i < node->neighbors.size(); i++)
{
if (visit[node->neighbors[i]->label] == 0)
{
Q.push(node->neighbors[i]);
}
}
}
}
int main()
{
const int MAX_N = 5;
GraphNode* Graph[MAX_N];
for (int i = 0; i < MAX_N; i++)
{
Graph[i] = new GraphNode(i);
}
Graph[0]->neighbors.push_back(Graph[4]);
Graph[0]->neighbors.push_back(Graph[2]);
Graph[1]->neighbors.push_back(Graph[0]);
Graph[1]->neighbors.push_back(Graph[2]);
Graph[2]->neighbors.push_back(Graph[3]);
Graph[3]->neighbors.push_back(Graph[4]);
Graph[4]->neighbors.push_back(Graph[3]);
int visit[MAX_N] = { 0 };
for (int i = 0; i < MAX_N; i++)
{
if (visit[i] == 0)
{
printf("From label (%d)", Graph[i]->label);
BFS_graph(Graph[i], visit);
}
printf("\n");
}
return 0;
}
运行结果为:
From label (0)0 4 2 3 3
From label (1)1