递归版:
BFS:
void bfs(int i)//bfs可以参照层序遍历来写
{
if (!visit2[i]) visit2[i]=1;//标记一下,告诉后面这个节点访问过了
for (int j = 0; j < N; j++)//N是节点个数
{
if (!visit2[j] && path[i][j] == 1)//path用来标志有无路径
{
visit2[j] = 1;
q.push(j);//入队
}
}
if (!q.empty())
{
int temp = q.front();
q.pop();
bfs(temp);
}
}
DFS:
void dfs(int i)
{
for (int j = 0; j < N; j++)//参考先序遍历
{
if (visit1[j] == 0&&path[i][j] == 1)//没有访问过
{
visit1[j] = 1;
dfs(j);
}
}
}
但是!
bfs最好不要用递归,很容易会栈溢出
所以
再来一份BFS的非递归代码
void BFSTravse(int i, int n)
{
visit2[i] = 1;
cout<<i<<" ";
if(!visit2[i])q.push(i);
for (int j = 1; j <= n; j++)
{
if (!visit2[j] && path[i][j] != NotPath)
{
q.push(j);
visit2[j] = 1;
}
}
while(!q.empty())
{
int p = q.front();
cout << p<<" ";
for (int j = 1; j <= n; j++)
{
if (!visit2[j] && path[p][j] != NotPath)
{
q.push(j);
visit2[j] = 1;
}
}
q.pop();
}
}