深度优先搜索DFS( 递归+非递归)
2014-10-31 20:30
585 查看
参考算法导论第三版 p349
/*
dfs搜索 - 邻接表
*/
#include <cstdio>
#include <vector>
#include <stack>
using std::vector;
using std::stack;
const int MAXN = 10;
struct Node
{
int d; //discovered 发现时间
int f; //finished 完成时间
int parent; //前驱结点
bool visit; //是否访问
};
Node node[MAXN];
int time = 0; // 模拟时间流逝
vector<vector<int>>g(MAXN);
void dfs_visit_1(int p) // recursion递归
{
node[p].d = ++time; // 第一次的时间是1
node[p].visit = true; // 已经访问过
for (int i = 0; i < g[p].size(); ++i)
{
int temp = g[p][i];
if (node[temp].visit == false)
{
node[temp].parent = p;
dfs_visit_1(temp);
}
}
node[p].f = ++time;
}
void dfs_visit_2(int p) // iteration 非递归,结果和递归的完全一样
{
node[p].d = ++time; // 第一次的时间是1
node[p].visit = true; // 已经访问过
stack<int> stk;
stk.push(p);
while (!stk.empty())
{
int t = stk.top();
int flag = true;
for (int i = 0; i < g[t].size(); ++i)
{
int temp = g[t][i];
if (node[temp].visit == false)
{//每次取栈顶元素的邻接表的一个未访问的, 其余没访问的
//等下一次栈顶降到它时再从中选一个访问
node[temp].d = ++time;
node[temp].visit = true;
node[temp].parent = t;
stk.push(temp);
flag = false;
break;
}
}
if (flag)
{
node[t].f = ++time;
stk.pop();
}
}
}
void dfs(int N)
{
for (int i = 1; i <= N; ++i) // 初始化
{
node[i].d = 0;
node[i].f = 0;
node[i].parent = 0;
node[i].visit = false;
}
time = 0;
for (int i = 1; i <= N; ++i) // 图可能不是连通的
{
if (node[i].visit == false)
{
dfs_visit_1(i); // 递归调用dfs_visit_1
dfs_visit_2(i); // 迭代调用dfs_visit_2
}
}
}
void print(int N)
{
for (int i = 1; i <= N; ++i)
{
printf("%d: d = %d, f = %d\n", i, node[i].d, node[i].f);
}
}
int main()
{
freopen("F://input.txt", "r", stdin);
int N, v, t;
scanf("%d", &N);
while (scanf("%d%d", &v, &t) != EOF)
{
g[v].push_back(t);//构造邻接表
}
dfs(N);
print(N);
}
/*
测试数据: 算法导论 p351的图
6
1 2
1 3
3 2
2 4
4 3
5 4
5 6
6 6
*/
/*
dfs搜索 - 邻接表
*/
#include <cstdio>
#include <vector>
#include <stack>
using std::vector;
using std::stack;
const int MAXN = 10;
struct Node
{
int d; //discovered 发现时间
int f; //finished 完成时间
int parent; //前驱结点
bool visit; //是否访问
};
Node node[MAXN];
int time = 0; // 模拟时间流逝
vector<vector<int>>g(MAXN);
void dfs_visit_1(int p) // recursion递归
{
node[p].d = ++time; // 第一次的时间是1
node[p].visit = true; // 已经访问过
for (int i = 0; i < g[p].size(); ++i)
{
int temp = g[p][i];
if (node[temp].visit == false)
{
node[temp].parent = p;
dfs_visit_1(temp);
}
}
node[p].f = ++time;
}
void dfs_visit_2(int p) // iteration 非递归,结果和递归的完全一样
{
node[p].d = ++time; // 第一次的时间是1
node[p].visit = true; // 已经访问过
stack<int> stk;
stk.push(p);
while (!stk.empty())
{
int t = stk.top();
int flag = true;
for (int i = 0; i < g[t].size(); ++i)
{
int temp = g[t][i];
if (node[temp].visit == false)
{//每次取栈顶元素的邻接表的一个未访问的, 其余没访问的
//等下一次栈顶降到它时再从中选一个访问
node[temp].d = ++time;
node[temp].visit = true;
node[temp].parent = t;
stk.push(temp);
flag = false;
break;
}
}
if (flag)
{
node[t].f = ++time;
stk.pop();
}
}
}
void dfs(int N)
{
for (int i = 1; i <= N; ++i) // 初始化
{
node[i].d = 0;
node[i].f = 0;
node[i].parent = 0;
node[i].visit = false;
}
time = 0;
for (int i = 1; i <= N; ++i) // 图可能不是连通的
{
if (node[i].visit == false)
{
dfs_visit_1(i); // 递归调用dfs_visit_1
dfs_visit_2(i); // 迭代调用dfs_visit_2
}
}
}
void print(int N)
{
for (int i = 1; i <= N; ++i)
{
printf("%d: d = %d, f = %d\n", i, node[i].d, node[i].f);
}
}
int main()
{
freopen("F://input.txt", "r", stdin);
int N, v, t;
scanf("%d", &N);
while (scanf("%d%d", &v, &t) != EOF)
{
g[v].push_back(t);//构造邻接表
}
dfs(N);
print(N);
}
/*
测试数据: 算法导论 p351的图
6
1 2
1 3
3 2
2 4
4 3
5 4
5 6
6 6
*/
相关文章推荐
- leetcode 139. Word Break 深度优先遍历DFS按照index递归搜索 + 很棒的动态规划DP做法
- 基于邻接矩阵实现的DFS深度优先搜索
- 算法 DFS深度优先搜索
- DFS深度优先搜索模板
- 图的深度优先和广度优先算法(DFS递归与非递归)
- GraphMatrix::DFS深度优先搜索
- nyoj 部分和问题(深度优先搜索DFS)
- 步步为营(十五)搜索(一)DFS 深度优先搜索
- 搜索------深度优先DFS-----模板1:例1 例2 例3 例4
- DFS深度优先搜索
- DFS(深度优先遍历搜索解析)
- leetcode 698. Partition to K Equal Sum Subsets K个相等子集 + 深度优先搜索DFS
- 深度优先搜索DFS:八皇后问题(去掉不能再一条斜线上的条件) C++
- 图的深度优先和广度优先算法(DFS递归与非递归)
- leetcode 124. Binary Tree Maximum Path Sum 最大路径和 + DFS深度优先搜索
- 图的深度优先和广度优先算法(DFS递归与非递归)
- 【数据结构】深度优先搜索BFS和广度优先搜索DFS
- Oil Deposits(深度优先搜索DFS)
- nyoj 部分和问题(深度优先搜索DFS)
- Sticks POJ1011 hdu1455 (深度优先搜索DFS)