第十二章 ALDS1_11_B:Depth First Search 深度优先搜索
2017-12-30 15:10
666 查看
知识点
深度优先搜索将最初访问的顶点压入栈
只要栈中还有顶点,就循环进行下面的步骤
访问栈顶部的顶点u,并删除u结点
若当前u与v有边,且v未访问过,则将v压入栈中,并标记v已经被访问过。
问题链接
ALDS1_11_B:Depth First Search问题内容
求出每个结点压入栈的时间和出栈的时间思路
递归进行深度优先搜索,当压入一个结点后,时间加1,然后访问这个结点,赋值到压栈时间d[i]中,当遍历完后,i结点就要出栈,此时赋值到出栈时间f[i]中。代码
#include <iostream> #include <cstdio> #include <cstring> #include <stack> using namespace std; const int maxx = 110; int n, m[maxx][maxx]; int u, num, v; int d[maxx], f[maxx]; int flag[maxx]; int nowtime = 1; void dfs(int u) { // 入栈时间 flag[u] = 1; d[u] = nowtime++; for (int i = 1; i <= n; i++) { if (flag[i] == 0 && m[u][i] == 1) { dfs(i); } } //出栈时间 f[u] = nowtime++; } int main() { scanf("%d", &n); memset(m, 0, sizeof(m)); memset(f, 0, sizeof(f)); for (int i = 1; i <= n; i++) { scanf("%d %d", &u, &num); for (int j = 1; j <= num; j++) { scanf("%d", &v); m[u][v] = 1; } } for (int i = 1; i <= n; i++) { if(flag[i] == 0) dfs(i); } for (int i = 1; i <= n; i++) { printf("%d %d %d\n", i, d[i], f[i]); } return 0; }
相关文章推荐
- 第十二章 ALDS1_11_C:Breadth First Search 广度优先搜索
- 树形搜索结构-深度优先搜索Depth First Search
- 深度优先搜索Depth-first search (DFS) for undirected graphs
- 深度优先搜索DFS(depth first search),拓扑排序
- 用栈实现深度搜索(Depth_first_search)
- javascript实现的图数据结构的广度优先 搜索(Breadth-First Search,BFS)和深度优先搜索(Depth-First Search,DFS)
- 一道题弄懂宽度优先搜索 Breadth first search
- 图搜索算法之广度优先搜索(Breadth First Search,BFS)
- BFS-宽度优先搜索(Breadth First Search)—1
- leetcode 98. Validate Binary Search Tree DFS深度优先搜索 + 两个递归函数 + 一个错误做法
- 图的遍历之广度优先搜索(Breadth First Search)
- 利用DSF深度优先搜索来解容器倒水问题
- 深度优先搜索简单入门
- 57.深度优先搜索 广搜练习:迷宫(未结题)
- 【游戏编程】AI-迷宫寻路算法-深度优先搜索和广度优先搜索
- 记忆化深度优先搜索
- leetcode:path sum:深度优先搜索
- 图论(五)深度优先搜索DFS
- (深度优先搜索第一课) 统计三角形 - DFS
- BFS(Breadth First Search)广度优先搜素,正在调试...