图的深度优先遍历
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了图的深度优先遍历相关的知识,希望对你有一定的参考价值。
图的迭代
// // Created by liuyubobobo on 9/22/16. // #ifndef INC_05_DFS_AND_COMPONENTS_DENSEGRAPH_H #define INC_05_DFS_AND_COMPONENTS_DENSEGRAPH_H #include <iostream> #include <vector> #include <cassert> using namespace std; // 稠密图 - 邻接矩阵 class DenseGraph{ private: int n, m; bool directed; vector<vector<bool>> g; public: DenseGraph( int n , bool directed ){ this->n = n; this->m = 0; this->directed = directed; for( int i = 0 ; i < n ; i ++ ) g.push_back( vector<bool>(n, false) ); } ~DenseGraph(){ } int V(){ return n;} int E(){ return m;} void addEdge( int v , int w ){ assert( v >= 0 && v < n ); assert( w >= 0 && w < n ); if( hasEdge( v , w ) ) return; g[v][w] = true; if( !directed ) g[w][v] = true; m ++; } bool hasEdge( int v , int w ){ assert( v >= 0 && v < n ); assert( w >= 0 && w < n ); return g[v][w]; } void show(){ for( int i = 0 ; i < n ; i ++ ){ for( int j = 0 ; j < n ; j ++ ) cout<<g[i][j]<<"\t"; cout<<endl; } } class adjIterator{ private: DenseGraph &G; int v; int index; public: adjIterator(DenseGraph &graph, int v): G(graph){ this->v = v; this->index = -1; } int begin(){ index = -1; return next(); } int next(){ for( index += 1 ; index < G.V() ; index ++ ) if( G.g[v][index] ) return index; return -1; } bool end(){ return index >= G.V(); } }; }; #endif //INC_05_DFS_AND_COMPONENTS_DENSEGRAPH_H // // Created by liuyubobobo on 9/22/16. // #ifndef INC_05_DFS_AND_COMPONENTS_SPARSEGRAPH_H #define INC_05_DFS_AND_COMPONENTS_SPARSEGRAPH_H #include <iostream> #include <vector> #include <cassert> using namespace std; // 稀疏图 - 邻接表 class SparseGraph{ private: int n, m; bool directed; vector<vector<int>> g; public: SparseGraph( int n , bool directed ){ this->n = n; this->m = 0; this->directed = directed; for( int i = 0 ; i < n ; i ++ ) g.push_back( vector<int>() ); } ~SparseGraph(){ } int V(){ return n;} int E(){ return m;} void addEdge( int v, int w ){ assert( v >= 0 && v < n ); assert( w >= 0 && w < n ); g[v].push_back(w); if( v != w && !directed ) g[w].push_back(v); m ++; } bool hasEdge( int v , int w ){ assert( v >= 0 && v < n ); assert( w >= 0 && w < n ); for( int i = 0 ; i < g[v].size() ; i ++ ) if( g[v][i] == w ) return true; return false; } void show(){ for( int i = 0 ; i < n ; i ++ ){ cout<<"vertex "<<i<<":\t"; for( int j = 0 ; j < g[i].size() ; j ++ ) cout<<g[i][j]<<"\t"; cout<<endl; } } class adjIterator{ private: SparseGraph &G; int v; int index; public: adjIterator(SparseGraph &graph, int v): G(graph){ this->v = v; this->index = 0; } int begin(){ index = 0; if( G.g[v].size() ) return G.g[v][index]; return -1; } int next(){ index ++; if( index < G.g[v].size() ) return G.g[v][index]; return -1; } bool end(){ return index >= G.g[v].size(); } }; }; #endif //INC_05_DFS_AND_COMPONENTS_SPARSEGRAPH_H
遍历操作类
// // Created by liuyubobobo on 9/22/16. // #ifndef INC_05_DFS_AND_COMPONENTS_COMPONENTS_H #define INC_05_DFS_AND_COMPONENTS_COMPONENTS_H #include <iostream> #include <cassert> using namespace std; template <typename Graph> class Component{ private: Graph &G; bool *visited; int ccount; int *id; void dfs( int v ){ visited[v] = true; id[v] = ccount; typename Graph::adjIterator adj(G, v); for( int i = adj.begin() ; !adj.end() ; i = adj.next() ){ if( !visited[i] ) dfs(i); } } public: Component(Graph &graph): G(graph){ visited = new bool[G.V()]; id = new int[G.V()]; ccount = 0; for( int i = 0 ; i < G.V() ; i ++ ){ visited[i] = false; id[i] = -1; } for( int i = 0 ; i < G.V() ; i ++ ) if( !visited[i] ){ dfs(i); ccount ++; } } ~Component(){ delete[] visited; delete[] id; } int count(){ return ccount; } bool isConnected( int v , int w ){ assert( v >= 0 && v < G.V() ); assert( w >= 0 && w < G.V() ); return id[v] == id[w]; } }; #endif //INC_05_DFS_AND_COMPONENTS_COMPONENTS_H
以上是关于图的深度优先遍历的主要内容,如果未能解决你的问题,请参考以下文章