图算法(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 }

 

posted @ 2014-01-07 14:30  Tiancai Ye  阅读(218)  评论(0)    收藏  举报