(栈)图的深度优先遍历

Posted 青少年信息学交流

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了(栈)图的深度优先遍历相关的知识,希望对你有一定的参考价值。

请点击上面微信号关注精彩内容 提高计算思维,传播编程知识,点亮未来人生!(栈)图的深度优先遍历





图的深度优先遍历



【题目描述】

        读入一个用邻接矩阵存储的无向图,输出它的深度优先遍历序列。

【输入】

         第一行1个整数n,表示图中的顶点数,2<=n<=100。
        接下来的n行是一个n*n的邻接矩阵,a[i][j]=1表示顶点i和顶点j之间有直接边相连,a[i][j]=0表示没有直接边相连。保证i=j时,a[[i][j]=0,并且a[i][j]=a[j][i]。

【输出】

        输出1~n的某一种排列,表示从顶点1开始,对该图进行深度优先遍历得到的顶点序列,每两个数之间用一个"-"分隔。

【输入样例】

8

0 1 1 0 0 0 0 0

1 0 0 1 1 0 0 0

1 0 0 0 0 0 1 1

0 1 0 0 0 1 0 0

0 1 0 0 0 1 0 0

0 0 0 1 1 0 0 0

0 0 1 0 0 0 0 1

0 0 1 0 0 0 1 0

【输出样例】


1-2-4-6-5-3-7-8




This browser does not support music or audio playback. Please play it in WeChat or another browser. (栈)图的深度优先遍历




程序代码 1 :

#include <iostream>
using namespace std;
int a[111][111]; // 邻接矩阵
int p[111]; // 辅助数组 (记录顶点有无访问过)
int n,tot;
void dfs(int v)
{
p[v]=1; // 顶点v访问过后 标记为1
tot++;
if(tot==1) cout<<v;
else cout<<"-"<<v;
for(int i=1;i<=n;i++) // 从1号顶点到n号顶点依次尝试,看哪些顶点与当前顶点v有边相连
{
if(a[v][i] && !p[i]) dfs(i); // 若有邻接点且该顶点没访问过 递归调用dfs
}
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++) // 输入邻接矩阵
{
for(int j=1;j<=n;j++)
{
cin>>a[i][j];
}
}
dfs(1); // 调用dfs函数(从顶点1开始)
return 0;
}



程序代码 2 :

#include <iostream>
#include <stack>
#include <cstring>
using namespace std;
int a[111][111]; // 邻接矩阵
int p[111]; // 标记辅助数组
int sta[111]; // 手工栈

int main()
{
int n,top=0,k=0;
cin>>n;
for(int i=1;i<=n;i++) // 读入邻接矩阵
{
for(int j=1;j<=n;j++)
{
cin>>a[i][j];
}
}

cout<<1; // 先输出起始顶点
sta[k]=1; // 将起始顶点入栈
p[1]=1; // 标记为已访问过
while(top>=0) // 栈非空 循环遍历
{
k++;
if(k>n) // 若大于顶点数
{
top--; //出栈
k=sta[top]; // k为当前栈顶元素顶点
}
else if(p[k]==0 && a[sta[top]][k]==1) // 若顶点k未访问过 且有顶点和顶点k有边相邻
{
cout<<"-"<<k; // 输出该顶点
p[k]=1; // 标记为已访问
top++;
sta[top]=k; // 入栈
k=0; // 清零 以遍历下一顶点
}
}
return 0;
}





程序代码  3:

#include <iostream>
#include <stack>
#include <cstring>
using namespace std;
int a[111][111]; // 邻接矩阵
int p[111]; // 辅助标记数组

int main()
{
int n,top=0,k=0;
cin>>n;
for(int i=1;i<=n;i++) // 读入邻接矩阵
{
for(int j=1;j<=n;j++)
{
cin>>a[i][j];
}
}

stack<int> sta; // 定义一个栈
cout<<1; // 先输出起始顶点
sta.push(1); // 将起始顶点入栈
p[1]=1; // 标记为已访问过
while(!sta.empty()) // 栈非空 循环遍历
{
k++; // 自增1
if(k>n) // 若大于定点数
{
sta.pop(); //出栈
k=sta.top(); // k为当前栈顶元素顶点
}
else if(p[k]==0 && a[sta.top()][k]==1) // 若顶点k未访问过 且有顶点和顶点k有边相邻
{
cout<<"-"<<k; // 输出该顶点
p[k]=1; // 标记为已访问
sta.push(k); // 入栈
k=0; // 清零 以遍历下一顶点
}
}
return 0;
}





(栈)图的深度优先遍历






◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ 

◆ “智能”是这个时代的主题,我们每天使用的手机软件,本质上是计算机程序;即将普及的“无人驾驶汽车”、“无人超市”,背后也是计算机程序。人工智能将逐步替代人类工作,我们应该让孩子走在这时代的浪潮前沿。

 ◆ 因为编程如此重要,所以全国的重点大学、高中都很看重具有编程能力的学生。获得信息学竞赛省级及以上级别奖项的学生,可获得全国重点大学保送自主招生资格

◆ 学习编程的最佳入门时期是:四、五、六年级和初一

如果您对信息学编程有一定的兴趣,数学基础好,请联系我们,会给你一个美好的未来人生!






更多精彩内容,请扫描二维码关注!

     

提高计算思维,编程创造未来!

                                                                                                      




以上是关于(栈)图的深度优先遍历的主要内容,如果未能解决你的问题,请参考以下文章

求图的深度优先遍历程序 c语言版

图的深度优先遍历DFS和广度优先遍历BFS(邻接矩阵存储)超详细完整代码进阶版

c语言图的遍历,邻接表存储,深度,广度优先遍历

什么是图的深度优先遍历?什么是图的广度优先遍历?

2023-03-29 图的深度优先遍历

Day10 图的深度优先遍历