深度优先搜索应用_深度优先生成树&&割点判断
2012-05-09 11:21
387 查看
//头文件
//测试文件
#include <vector> #include <map> #include <utility> #include <cassert> #include <iostream> #include <cmath> using namespace std; namespace dfst { const static int INVALID_VERTEX = -1; typedef struct _Node { int v; int v_parent; bool invested; _Node( int _v=INVALID_VERTEX, int _v_parent=INVALID_VERTEX, bool _invested=false ) :v(_v), v_parent(_v_parent), invested(_invested) {} }Node, *pNode; vector<vector<int> > vGraph; vector<Node> vDFSTree; int iTreeSize; void InitTree(void) { iTreeSize = vGraph.size(); vDFSTree.clear(); vDFSTree.resize( iTreeSize ); } void dfs(int src) { vDFSTree[src].invested = true; vDFSTree[src].v = src; for ( vector<int >::iterator it=vGraph[src].begin(); it!=vGraph[src].end(); ++it ) { if ( !vDFSTree[*it].invested ) { cout << *it <<" "; vDFSTree[*it].v_parent = src; dfs( *it ); } } } void PrintGraph(void) { int i(0); for ( vector<vector<int> >::iterator itvv=vGraph.begin(); itvv!=vGraph.end(); ++itvv ) { cout << i++ << ": "; for ( vector<int >::iterator itv=itvv->begin(); itv!=itvv->end(); ++itv ) cout << *itv << " "; cout << endl; } } void PrintDFSTree(void) { for ( int i=0; i<iTreeSize; ++i ) cout << vDFSTree[i].v_parent << "-->" << vDFSTree[i].v << endl; } void PrintAll(void) { cout << "depth-first spanning tree:" << endl; PrintGraph(); PrintDFSTree(); } }; namespace dfst_ex { const static int INVALID_VERTEX = -1; const static int INVALID_VALUE = -1; typedef struct _Node { int v; int v_parent; int num; int low; bool invested; _Node( int _v=INVALID_VERTEX, int _v_parent=INVALID_VERTEX, int _num=INVALID_VALUE, int _low=INVALID_VALUE, bool _invested=false ) :v(_v), v_parent(_v_parent), num(_num), low(_low), invested(_invested) {} }Node, *pNode; vector<vector<int> > vGraph; vector<Node> vDFSTree; map<int, int > mArticulationPoint; int iTreeSize; void InitTree(void) { iTreeSize = vGraph.size(); vDFSTree.clear(); vDFSTree.resize( iTreeSize ); mArticulationPoint.clear(); } void assignNum(int src) { static int counter = 0; vDFSTree[src].invested = true; vDFSTree[src].v = src; vDFSTree[src].num = counter++; for ( vector<int >::iterator it=vGraph[src].begin(); it!=vGraph[src].end(); ++it ) { if ( !vDFSTree[*it].invested ) { vDFSTree[*it].v_parent = src; assignNum( *it ); } } } void assignLow(int src) { vDFSTree[src].low = vDFSTree[src].num; for ( vector<int >::iterator it=vGraph[src].begin(); it!=vGraph[src].end(); ++it ) { if ( vDFSTree[*it].num>vDFSTree[src].num ) //forward { assignLow(*it); if ( vDFSTree[*it].low>=vDFSTree[src].num && vDFSTree[src].num!=0 ) mArticulationPoint.insert(std::make_pair(*it, *it)); vDFSTree[src].low = min( vDFSTree[src].low, vDFSTree[*it].low); } else//backward { if ( vDFSTree[src].v_parent!=*it ) vDFSTree[src].low = min(vDFSTree[src].low, vDFSTree[*it].num); } } } void PrintGraph(void) { int i(0); cout << "graph: " << endl; for ( vector<vector<int> >::iterator itvv=vGraph.begin(); itvv!=vGraph.end(); ++itvv ) { cout << i++ << ": "; for ( vector<int >::iterator itv=itvv->begin(); itv!=itvv->end(); ++itv ) cout << *itv << " "; cout << endl; } } void PrintDFSTree(void) { cout << "dfstree: "<< endl; int i(0); for ( i=0; i<iTreeSize; ++i ) cout << i << ": " << vDFSTree[i].num << " "<< vDFSTree[i].low << endl; cout << "dfstree generation: "<< endl; for ( i=0; i<iTreeSize; ++i ) cout << vDFSTree[i].v_parent << "-->" << vDFSTree[i].v << endl; } void PrintArti(void) { cout << "articulation point: " << endl; for ( map<int, int>::iterator it=mArticulationPoint.begin(); it!=mArticulationPoint.end(); ++it) { cout << it->second << " " ; } cout << endl; } void PrintAll(void) { PrintGraph(); PrintDFSTree(); PrintArti(); } void Dfst_Ex( int src) { InitTree(); assignNum(src); assignLow(src); PrintAll(); } };
//测试文件
#include <iostream> #include <cstdlib> #include <vector> #include "dfs.h" #define _DFST_EX_ int main() { #ifdef _DFST_ { using namespace dfst; vector<int> v; vGraph.clear(); //v0 v.clear(); v.push_back(1); v.push_back(3); v.push_back(4); vGraph.push_back(v); //v1 v.clear(); v.push_back(0); v.push_back(2); v.push_back(3); vGraph.push_back(v); //v2 v.clear(); v.push_back(1); v.push_back(3); v.push_back(4); vGraph.push_back(v); //v3 v.clear(); v.push_back(0); v.push_back(1); v.push_back(2); vGraph.push_back(v); //v4 v.clear(); v.push_back(0); v.push_back(2); v.push_back(3); vGraph.push_back(v); InitTree(); dfs(1); PrintAll(); } #endif #ifdef _DFST_EX_ { using namespace dfst_ex; vector<int> v; vGraph.clear(); //v0 v.clear(); v.push_back(1); v.push_back(3); vGraph.push_back(v); //v1 v.clear(); v.push_back(0); v.push_back(2); vGraph.push_back(v); //v2 v.clear(); v.push_back(1); v.push_back(3); v.push_back(6); vGraph.push_back(v); //v3 v.clear(); v.push_back(0); v.push_back(2); v.push_back(4); v.push_back(5); vGraph.push_back(v); //v4 v.clear(); v.push_back(3); v.push_back(5); vGraph.push_back(v); //v5 v.clear(); v.push_back(3); v.push_back(4); vGraph.push_back(v); //v6 v.clear(); v.push_back(2); vGraph.push_back(v); Dfst_Ex(0); } #endif system("pause"); return 0; }
相关文章推荐
- 数据结构----深度优先搜索的应用
- File&&文件搜索深度优先和广度优先
- 深度优先搜索生成全错序排列
- 深度优先搜索生成迷宫
- 深度优先搜索应用:走迷宫
- 【Python排序搜索基本算法】之深度优先搜索、广度优先搜索、拓扑排序、强联通&Kosaraju算法
- 深度优先搜索的演示学习法——BlackBlank平台应用教学案例
- Java实现图:邻接矩阵表示、深度优先搜索、广度优先搜索、无向图的最小生成树
- 求解:栈的应用 深度优先搜索:迷宫问题
- 深度优先搜索的过河问题应用
- 搜索之深度优先【迷宫搜索】(判断是否n步恰好可以到达某点)
- 迷宫问题的求解方式:应用深度优先和广度优先的搜索
- leetcode 45. Jump Game II 贪心算法&&DFS深度优先搜索
- 数据结构学习_图(1)深度优先搜索、广度优先搜索和最小生成树
- 【数据结构】安卓平台下深度优先搜索的应用--走迷宫
- DFS深度优先搜索结合剪枝的应用
- 深度优先搜索 && 广度优先搜索
- 搜索之深度优先【迷宫搜索】(判断是否n步恰好可以到达某点)
- 深度优先搜索DFS/广度优先搜索BFS的一个应用实例(华为编程大赛赛题)
- 【Python排序搜索基本算法】之深度优先搜索、广度优先搜索、拓扑排序、强联通&Kosaraju算法