C++ 图的宽度优先遍历

从图中某个顶点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
发布了79 篇原创文章 · 获赞 62 · 访问量 2213

猜你喜欢

转载自blog.csdn.net/weixin_44208324/article/details/104908895