对邻接链表的深度优先(DFS)遍历
2015-01-14 18:25
267 查看
深度优先搜索算法在搜索过程中对节点进行涂色来指明节点的当前状态. 每个节点的初始颜色都是白色. 在节点被发现后变成灰色. 在其邻接链表被扫描完成之后变成黑色. 该方法可以保证每个节点只在一棵深度优先树中出现, 因此, 所有的深度优先树是不相交(disjoint)的.
除了创建深度优先搜索森林之外, 该方法还在每个节点盖上两个时间戳. 一个是被发现的时间(涂上灰色的时间), 另一个是完成对v的邻接链表扫描的时间(涂上黑色的时间). 这些时间戳提供了图的结构的重要信息.
当DFS算法返回时, 每个顶点都已经被赋予了一个发现时间和一个完成时间.
除了创建深度优先搜索森林之外, 该方法还在每个节点盖上两个时间戳. 一个是被发现的时间(涂上灰色的时间), 另一个是完成对v的邻接链表扫描的时间(涂上黑色的时间). 这些时间戳提供了图的结构的重要信息.
当DFS算法返回时, 每个顶点都已经被赋予了一个发现时间和一个完成时间.
一. DFS-VISIT子过程
void Graph::dfs_visit(Vertice* n, int& timestamp) { ++timestamp; n->color = GRAY; n->begin = timestamp; // 深度优先访问每一个白色节点 for (auto adj : n->adjacentVertices) { if (adj.target->color == WHITE) dfs_visit(adj.target, timestamp); } // 所有相邻节点都访问完毕之后, 标记当前结点为黑色, 并加盖"完成访问"时间戳 n->color = BLACK; ++timestamp; n->end = timestamp; }
二. DFS主过程
void Graph::dfs() { for (auto node : allVertices) { // node的类型是pair<int, Vertice*> // node.second指的是这个键值对的因变量(Vertice*) node.second->begin = 0; node.second->end = 0; node.second->color = WHITE; } int timestamp = 0; for (auto it = allVertices.begin(); it != allVertices.end(); ++it) { if (it->second->color == WHITE) dfs_visit(it->second, timestamp); } }
相关文章推荐
- leetcode 653. Two Sum IV - Input is a BST 中序遍历 + 深度优先遍历DFS
- 邻接矩阵存储的无向图深度优先(DFS)广度优先(BFS)遍历
- poj 1154(dfs深度优先遍历)
- 图邻接链表基本操作--广度优先、深度优先、拓扑排序
- Java数据结构----图--深度优先遍历BFS和广度优先遍历DFS
- 邻接图的深度广度优先遍历
- 深度优先遍历DFS
- leetcode 399. Evaluate Division 等式求解+典型的DFS深度优先遍历
- 深度优先遍历DFS
- leetcode 671. Second Minimum Node In a Binary Tree 第二小数字 + 深度优先遍历DFS
- 第十二周项目三 图遍历算法实现——深度优先(DFS)遍历
- leetcode 749. Contain Virus 消灭病毒建立墙 + 深度优先遍历DFS
- DFS 深度优先遍历
- leetcode 282. Expression Add Operators 任意添加运算符计算结果 +深度优先遍历DFS
- 深度优先搜索遍历(DFS)——邻接矩阵存储
- leetcode 402. Remove K Digits 贪心算法 + DFS深度优先遍历 + stack
- 第12周—项目3(1) 图遍历算法—实现深度优先遍历——DFS
- leetcode 669. Trim a Binary Search Tree 修建二叉搜索树BST + 深度优先遍历DFS
- 蓝桥杯 振兴中华(DFS深度优先遍历)
- 深度优先搜索遍历(DFS)——邻接表存储