图的深度优先搜索DFS(C++实现) 📊🧐_dfs时间戳 c++
深度优先搜索(DFS)是一种用于遍历或搜索树或图的算法。这个算法会尽可能深地搜索树的分支。当节点v的所在边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。如果还存在未被发现的节点,则选择其中一个作为新的源节点,并重复上述过程,直到所有节点都被访问为止。
在C++中,我们可以使用递归或者栈来实现DFS。这里我们以邻接表的方式存储图,这样可以方便地进行DFS遍历。此外,为了记录每个节点的访问时间,我们还可以使用两个数组来记录进入时间(in_time)和离开时间(out_time)。通过这些时间戳,我们可以更好地理解图的结构,比如判断边的方向,或者检测环等。
下面是一个简单的示例代码,展示了如何用C++实现DFS以及时间戳的概念:
```cpp
include
include
using namespace std;
// 定义图的邻接表表示
class Graph {
int V; // 顶点的数量
list
public:
Graph(int V); // 构造函数
void addEdge(int v, int w); // 添加边
void DFSUtil(int v, bool visited[], int &time, int in_time[], int out_time[]); // 辅助函数
void DFS(); // 主函数
};
Graph::Graph(int V) {
this->V = V;
adj = new list
}
void Graph::addEdge(int v, int w) {
adj[v].push_back(w);
}
void Graph::DFSUtil(int v, bool visited[], int &time, int in_time[], int out_time[]) {
visited[v] = true;
in_time[v] = ++time;
for (auto i = adj[v].begin(); i != adj[v].end(); ++i)
if (!visited[i])
DFSUtil(i, visited, time, in_time, out_time);
out_time[v] = ++time;
}
void Graph::DFS() {
bool visited = new bool[V];
int time = 0;
int in_time = new int[V];
int out_time = new int[V];
for (int i = 0; i < V; i++) {
visited[i] = false;
in_time[i] = 0;
out_time[i] = 0;
}
for (int i = 0; i < V; i++)
if (visited[i] == false)
DFSUtil(i, visited, time, in_time, out_time);
}
```
以上就是利用C++实现图的深度优先搜索(DFS)并记录时间戳的方法。希望对你有所帮助!🔍✨
免责声明:本答案或内容为用户上传,不代表本网观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。 如遇侵权请及时联系本站删除。