您的位置:首页 > 其它

对邻接链表的深度优先(DFS)遍历

2015-01-14 18:25 267 查看
深度优先搜索算法在搜索过程中对节点进行涂色来指明节点的当前状态. 每个节点的初始颜色都是白色. 在节点被发现后变成灰色. 在其邻接链表被扫描完成之后变成黑色. 该方法可以保证每个节点只在一棵深度优先树中出现, 因此, 所有的深度优先树是不相交(disjoint)的.

除了创建深度优先搜索森林之外, 该方法还在每个节点盖上两个时间戳. 一个是被发现的时间(涂上灰色的时间), 另一个是完成对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);
}
}







内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: