深度优先搜索遍历类似于树的先根遍历,是树的先根遍历的推广。假设初始状态是图中所有的顶点未曾访问过,则深度优先搜索可从从中某个顶点出发,访问该顶点,然后依次从v的未被访问的邻接点出发深度优先遍历图,直至图中所有和v有路径相通的顶点都被访问到;若此时图中尚有顶点未被访问过,则另选图中一个未曾访问的顶点作为起始点,重复上述过程,直至图中所有顶点都被访问过为止。当以邻接表作图的存储结构时,深度优先搜索遍历图的时间复杂度为o(n + e)。运行结果:(单位ms)#include<iostream> #include<vector> #include<fstream> #include<time.h> using namespace std; void readGraph();//读取文件,存储图 void DFSTraverse();//图的深度优先搜索 void DFS(int v);//从某个顶点出发的深度优先搜索 int nodeNum;//图中顶点数 int edgeNum;//图中边数 vector<vector<int>> mGraph;//图的存储结构 bool *visited;//是否访问的当前节点的数组 //从文件中读取数据,存储在图中 void readGraph() { fstream fin("E:\\myData\\cit-Patents.txt"); fin>>nodeNum>>edgeNum; mGraph.resize(nodeNum); visited = new bool[nodeNum]; for(int i = 0; i < nodeNum; ++i) { visited[i] = false; } int num1, num2, node; for(int i = 0; i < nodeNum; ++i) { fin>>num1>>num2; mGraph[i].reserve(num2); for(int j = 0; j < num2; ++j) { fin>>node; mGraph[i].push_back(node); } } fin.close(); } void DFSTraverse() { for(int i = 0; i < nodeNum; ++i) { if(!visited[i]) { DFS(i); } } } void DFS(int v) { //cout<<v<<endl; visited[v] = true; int count = mGraph[v].size(); for(int i = 0; i < count; ++i) { if(!visited[mGraph[v][i]]) { DFS(mGraph[v][i]); } } } int main(void) { clock_t start,end; start = clock(); readGraph(); cout<<"图中节点数:"<<nodeNum<<endl; cout<<"图中边数:"<<edgeNum<<endl; end = clock(); cout<<"读取文件初始化图的时间:"<<float(end - start)/CLOCKS_PER_SEC*1000<<endl; start = clock(); DFSTraverse(); end = clock(); cout<<"深度优先搜索时间:"<<float(end - start)/CLOCKS_PER_SEC*1000<<endl; system("pause"); return 0; }
数据集为(web-uk)
图中节点数:22753644
图中边数:38184039
读取文件初始化图的时间:108524
深度优先搜索时间:464
数据集为(cit-Patents)
图中节点数:3774768
图中边数:16518947
读取文件初始化图的时间:30011
深度优先搜索时间:222
数据集为(citeseerx)
图中节点数:1457057
图中边数:3002252
读取文件初始化图的时间:6655
深度优先搜索时间:40
结果分析:图中顶点数与边数之和越大,深度优先搜索时间越大。
图的遍历之深度优先搜索
最新推荐文章于 2022-04-06 00:10:15 发布