任务描述
相关知识
邻接矩阵
深度优先遍历-用栈实现
深度优先遍历-用递归实现
编程要求
测试说明
任务描述
本关任务:编写一个能用深度优先方法遍历下图各结点的程序。
相关知识
为了完成本关任务,你需要掌握:1.如何用邻接矩阵定义图,2.如何设计图的深度优先遍历算法。
邻接矩阵
邻接矩阵用一个矩阵(二维数组)Adj来表示图中结点的关系。如果结点编号用整数表示,则Adj[i][j]=0表示两个结点i和j之间无边。如果Adj[i][j]=1,则表示结点i到结点j存在一个有向边。
深度优先遍历-用栈实现
第一步,深度优先定义一个栈,将起点start入栈。这个栈用于存放着目前想访问的点。下面开始循环进行结点的访问。
第二步,从栈中取出一个点p访问(打印),然后将所有p的邻居入栈。然后反复重复第二步, 直到栈空。
因为栈具有后进先出的特点,可知下一步将访问新入栈的点, 而栈里的旧的点则落到最后访问。换句话说,每次选择的是离start最远的点进行访问。因此称为深度优先遍历。
深度优先遍历-用递归实现
换一种思路,假设start有k个邻居, 那么如果把这k个点分别作为起点,递归完成对图的遍历,也实现了对整个图的遍历。
编程要求
根据提示,在右侧编辑器补充代码,先填好邻接矩阵,再设计深度优先算法(你可以用栈,或者用递归,或者你都试一下)。
测试说明
平台会对你编写的代码进行测试, 输入一个start, 输出字符打印序列。
开始你的任务吧,祝你成功!
#include <stdio.h>
#include "SeqStack.h"
#define N 7
char Name[N+1]="ABCDEFG";
int Adj[N][N]=
{
//你在这里完成邻接矩阵初始化
{0,1,1,0,0,0,0},
{0,0,0,1,0,0,0},
{0,0,0,1,1,0,0},
{0,0,1,0,0,1,1},
{0,0,0,1,0,0,1},
{0,0,0,0,0,0,1},
{0,0,0,0,0,0,0}
};
int visit[N]={0};
void DF(int i){
printf("%c", Name[i]);
visit[i]=1;
for (int j = 0; j < N; ++j) {
if ( Adj[i][j]== 1 && visit[j]==0){
DF(j); // 对为访问的邻接顶点递归调用
}
}
}
void DFS(int start){
//你在这里写一个深度优先的打印图中字符的遍历程序
int i;
// 初始化所有顶点状态都是未访问过状态
for (i = 0; i <N; ++i) {
visit[i] = 0;
}
//防止图为非联通的情况,遍历整个图
for (i = start; i < N; ++i) {
if (visit[i]==0){ // 若是连通图,只会执行一次
DF(i);
}
}
}