C++ 图的深度优先遍历

从图中某个顶点v出发,首先访问该顶点,然后依次从它的各个未被访问的邻接点出发,深度优先搜索遍历图,直至图中所有和v有路径相通且未被访问的顶点都被访问到。若此时尚有其他顶点未被访问到,则另选一个未被访问的顶点作起始点,重复上述过程,直至图中所有顶点都被访问到为止。

#include<vector>
struct GraphNode
{
 int label;
 std::vector<GraphNode*> neighbors;
 GraphNode(int x) : label(x) {};
};
void DFS_Graph(GraphNode * node, int visit[])
{
 visit[node->label ]= 1;
 printf("%d      ", node->label);
 for (int i = 0; i < node->neighbors.size(); i++)
 {
  if (visit[node->neighbors[i]->label]==0)
  {
   DFS_Graph(node->neighbors[i],visit);
  }
 }
}
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);
   DFS_Graph(Graph[i],visit);
   printf("\n");
  }
 }
 for (int i = 0; i < MAX_N; i++)
 {
  delete Graph[i];
 }
 return 0;
}

运行结果:

From label(0):     0      4      3      2
From label(1):     1
发布了79 篇原创文章 · 获赞 62 · 访问量 2214

猜你喜欢

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