0001 template <typename Tv, typename Te> //深度优先搜索(单个可达分量) 0002 void Graph<Tv, Te>::DFS(Rank v, Rank& clock) { //0 <= v < n 0003 dTime(v) = clock++; status(v) = DISCOVERED; //发现当前顶点v 0004 for (Rank u = firstNbr(v); -1 != u; u = nextNbr(v, u)) //考查v的每一个邻居u 0005 switch (status(u)) { //并视其状态分别处理 0006 case UNDISCOVERED : //u尚未发现,意味着支撑树可在此拓展 0007 type(v, u) = TREE; parent(u) = v; DFS(u, clock); break; 0008 case DISCOVERED : //u已被发现但尚未访问完毕,应属被后代指向的祖先 0009 type(v, u) = BACK; break; 0010 default : //VISITED:视承袭关系分为前向边或(有向图才可能有的)跨边 0011 type(v, u) = dTime(v) < dTime(u) ? FORWARD : CROSS; break; 0012 } 0013 status(v) = VISITED; fTime(v) = clock++; //至此,当前顶点v方告访问完毕 0014 } //DFS