在对无向图进行遍历时,对于连通图,仅需要从图中的任意一个顶点出发,进行深度优先搜索或广度优先搜索,便可访问到图中所有顶点。对于非连通图,则需从多个顶点出发进行搜索,而每一次从一个新的起点出发进行搜索过程中得到的顶点访问序列恰为其各个连通分量中顶点集。对于非连通图,每个连通分量中的顶点集,和遍历时走过的边一起构成若干棵生成树,这些连通分量的生成树组成非连通图的生成森林。我们以孩子兄弟链表作为深度优先生成森林的存储结构,时间复杂度为o(n + e)。#include<iostream> #include<fstream> #include<vector> #include<time.h> #include<algorithm> using namespace std; struct CSTree { int data; CSTree * lchild; CSTree * nextsibling; }; void DFSTree(int v,CSTree *&p); void DFSForest(CSTree *&root); CSTree *root = NULL;//生成森林 bool *visited; vector<vector<int>> mGraph;//图结构 int nodeNum;//图中顶点数 int edgeNum;//图中边数 void readGraph() { fstream fin("E:\\myData\\facebook_combined.txt");//打开文件 fin>>nodeNum>>edgeNum;//读取顶点数和边数 mGraph.resize(nodeNum);//设置图的大小 visited = new bool[nodeNum]; for(int i = 0; i < nodeNum; ++i) { visited[i] = false; } int num1, num2; while(fin>>num1
无向图中的深度优先生成森林
最新推荐文章于 2022-08-18 17:49:38 发布