原理和方法可以参考: 图的深度优先遍历
教科书上的C代码,递归:
1 //教科书方法,邻接表 2 bool visited[MAX]; 3 void visitFunc(int v); 4 5 void dfsTraverse(Graph G) 6 { 7 for(v = 0; v < G.vexnum; ++v) //初始化访问标识为false 8 visited[v] = false; 9 for(v = 0; v < G.vexnum; ++v) //深搜 10 if(!visited[v]) 11 dfs(G, v); 12 } 13 14 void dfs(Graph G, int v) 15 { 16 visited[v] = true; 17 visitFunc(v); 18 for(w = firstAdjVex(G, v); w; w = nextAdjVex(G, v, w)) //遍历邻接表 19 if(!visited[w]) 20 dfs(G, w); 21 }
迭代版:
1 //使用堆栈来保持顺序,迭代 2 void dfsTraverse(GraphNode *G) 3 { 4 unordered_map<GraphNode *, bool> visited; 5 stack<GraphNode*> unvisited; 6 unvisited.push(G); //第一个结点入栈 7 while( !unvisited.empty() ) 8 { 9 cur = unvisited.top(); 10 unvisited.pop(); 11 12 for(w = G.neighbor; w != NULL; w = w->next) //遍历邻接表 13 if( visited.find(w->Node) == visited.end() ) 14 { 15 unvisited.push(w->Node); 16 visited[w->Node] = true; 17 } 18 19 visitFunc(cur); 20 } 21 }
算法题——图的深度优先遍历
时间: 2024-11-08 02:23:34