(栈)图的深度优先遍历
Posted 青少年信息学交流
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了(栈)图的深度优先遍历相关的知识,希望对你有一定的参考价值。
图的深度优先遍历
【题目描述】
【输入】
【输出】
【输入样例】
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
程序代码 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;
}
◆ ◆◆ ◆ ◆◆ ◆ ◆◆ ◆ ◆◆ ◆ ◆◆ ◆ ◆◆ ◆ ◆◆ ◆ ◆◆ ◆ ◆◆ ◆
◆ “智能”是这个时代的主题,我们每天使用的手机软件,本质上是计算机程序;即将普及的“无人驾驶汽车”、“无人超市”,背后也是计算机程序。人工智能将逐步替代人类工作,我们应该让孩子走在这时代的浪潮前沿。
◆ 因为编程如此重要,所以全国的重点大学、高中都很看重具有编程能力的学生。获得信息学竞赛省级及以上级别奖项的学生,可获得全国重点大学保送和自主招生资格。
◆ 学习编程的最佳入门时期是:四、五、六年级和初一。
更多精彩内容,请扫描二维码关注!
提高计算思维,编程创造未来!
以上是关于(栈)图的深度优先遍历的主要内容,如果未能解决你的问题,请参考以下文章