第1关:深度优先遍历图结点

任务描述
相关知识
邻接矩阵
深度优先遍历-用栈实现
深度优先遍历-用递归实现
编程要求
测试说明
任务描述


本关任务:编写一个能用深度优先方法遍历下图各结点的程序。

相关知识
为了完成本关任务,你需要掌握: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);
        }
    }

   
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值