图算法(2)-深度优先遍历
深度优先遍历中,我们使用的数据结构与上一讲基本相同,除了Node做了修改:
1 struct Node 2 { 3 std::string value; 4 std::vector<Edge> edges; 5 int d; 6 int f; 7 int p; 8 Color color; 9 };
这里d表示discovery time,记录节点首次被遍历到的时间,f表示finish time,记录节点遍历完成返回的时间。
算法中使用了一个全局变量time,目的是为了打上时间戳:
1 int time; 2 3 void DFS(Graph& g, int u) 4 { 5 g.nodes[u].d = ++time; 6 g.nodes[u].color = GRAY; 7 8 for (size_t i = 0; i < g.nodes[u].edges.size(); ++i) 9 { 10 int v = g.nodes[u].edges[i].end; 11 if (g.nodes[v].color == WHITE) 12 { 13 g.nodes[v].p = u; 14 DFS(g, v); 15 } 16 } 17 18 g.nodes[u].f = ++time; 19 g.nodes[u].color = BLACK; 20 } 21 22 void DFS(Graph& g) 23 { 24 for (size_t i = 0; i < g.nodes.size(); ++i) 25 { 26 g.nodes[i].p = -1; 27 g.nodes[i].color = WHITE; 28 } 29 time = 0; 30 for (size_t i = 0; i < g.nodes.size(); ++i) 31 { 32 if (g.nodes[i].color == WHITE) 33 DFS(g, i); 34 } 35 }