首页 > 精选要闻 > 精选百科 >

图的深度优先搜索DFS(C++实现) 📊🧐_dfs时间戳 c++

发布时间:2025-03-02 09:16:34来源:网易

深度优先搜索(DFS)是一种用于遍历或搜索树或图的算法。这个算法会尽可能深地搜索树的分支。当节点v的所在边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。如果还存在未被发现的节点,则选择其中一个作为新的源节点,并重复上述过程,直到所有节点都被访问为止。

在C++中,我们可以使用递归或者栈来实现DFS。这里我们以邻接表的方式存储图,这样可以方便地进行DFS遍历。此外,为了记录每个节点的访问时间,我们还可以使用两个数组来记录进入时间(in_time)和离开时间(out_time)。通过这些时间戳,我们可以更好地理解图的结构,比如判断边的方向,或者检测环等。

下面是一个简单的示例代码,展示了如何用C++实现DFS以及时间戳的概念:

```cpp

include

include

using namespace std;

// 定义图的邻接表表示

class Graph {

int V; // 顶点的数量

list adj; // 指向邻接表的指针

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[V];

}

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)并记录时间戳的方法。希望对你有所帮助!🔍✨

免责声明:本答案或内容为用户上传,不代表本网观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。 如遇侵权请及时联系本站删除。