任务描述

本关任务:实现 graph.cpp 里的函数int Graph_DepthFirst(Graph*g, int start, Edge* tree)。 注意遵守约定:编号大的先进栈。

相关知识

图 2 给出了对图 1 的无向图的存储结构图:每个顶点的名称由一个字符串描述,所有字符串的起始地址组织为一个数组,数组的起始地址为vetex;顶点的相邻关系保存在相邻矩阵中,其起始地址为adjadj[i*n+j]的值为 1 表示i号顶点到j号顶点有边,为 0 表示无边,其中n是顶点个数,ij是顶点在顶点表中的编号。 将n,vetex,adj组织成结构:

  1. struct Graph {
  2. int n;//顶点数
  3. char** vetex;
  4. int* adj;
  5. };

给定指向该结构的指针g,就可以对图进行操作。

深度优先遍历算法(伪代码):

  1. DepthFirst(Graph, start)
  2. //输入Graph是图,start是开始顶点的编号
  3. //输出:tree_edge[i]=<from,to>是遍历树的一条边
  4. //tree_edge[1..n-1]为遍历树的n-1条边
  5. //tree_edge[0].to … tree_edge[n-1].to是遍历序列
  6. PUSH(<-1,start>)
  7. k=0;
  8. while(StackNotEmpty) {
  9. <a,b>=POP;
  10. if (unvisited(b)) {
  11. visit(b); //visit b, and set a flag for b.
  12. tree_edge[k++]=<a,b>; // add <a,b> to the tree
  13. for each <b,c> in the Edge Set {
  14. if (unvisited(c)) PUSH(<b,c>); //约定:编号大的先进栈
  15. }
  16. }
  17. }

对图 1 的树运行该算法的结果: 生成树的边是:{<-1,A><A,B><B,D><D,C><B,F><F,E>}; 深度优先遍历的顶点访问次序是:ABDCFE。 ####编程要求 本关任务是实现 graph.cpp 里的函数int Graph_DepthFirst(Graph*g, int start, Edge* tree)。 注意遵守约定:编号大的先进栈。

  1. //Graph.cpp
  2. ///
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6. #include "Graph.h"
  7. Graph* Graph_Create(int n)
  8. {
  9. Graph* g=(Graph*)malloc(sizeof(Graph));
  10. g->n=n;
  11. g->vetex=(char**)malloc(sizeof(char*)*n);
  12. int i;
  13. for (i=0; i<n; i++) g->vetex[i] = NULL;
  14. g->adj=(int*)malloc(sizeof(int)*n*n);
  15. int j;
  16. for(i=0; i<n; i++) {
  17. for(j=0; j<n; j++) {
  18. g->adj[i*n+j]=0;
  19. }
  20. }
  21. return g;
  22. }
  23. void Graph_Free(Graph* g)
  24. {
  25. free(g->adj);
  26. int i;
  27. for (i=0; i<g->n; i++) free(g->vetex[i]);
  28. free(g->vetex);
  29. free(g);
  30. }
  31. int Graph_DepthFirst(Graph*g, int start, Edge* tree)
  32. //从start号顶点出发深度优先遍历,(编号从0开始)
  33. //返回访问到的顶点数,
  34. //tree[]输出遍历树
  35. //返回的tree[0]是(-1, start),
  36. //真正的遍历树保存在tree[1..return-1], return是返回值
  37. //顶点的访问次序依次为tree[0].to, tree[1].to, ..., tree[return-1].to
  38. //输入时,tree[]的长度至少为顶点数
  39. //返回值是从start出发访问到的顶点数
  40. {
  41. //在begin和end之间添加你的代码
  42. /*****begin*****/
  43. /*****end*******/
  44. }

测试说明

本关的测试过程如下:

  1. 平台编译 step2/Main.cpp ;
  2. 平台运行该可执行文件,并以标准输入方式提供测试输入;
  3. 平台获取该可执行文件的输出,然后将其与预期输出对比,如果一致则测试通过;否则测试失败。

输入输出格式:

输入格式: 输入n,顶点数 输入n个字符串,即n个顶点的名称,其编号按输入次序是:0,...,n-1。 输入若干数字对(a b)或<a b>(a b)表示无向边,<a b>表示有向边 输入字符x,表示边输入结束 输入一个数start,表示开始顶点的编号

输出格式: 输出生成树的边序列,边的第start个顶点构成的序列应是顶点访问序列

以下是平台对 step2/Main.cpp 的测试样例: 样例输入

  1. 6
  2. A
  3. B
  4. C
  5. D
  6. E
  7. F
  8. ( 0 1 )
  9. ( 0 2 )
  10. ( 0 5 )
  11. ( 1 3 )
  12. ( 1 5 )
  13. ( 2 3 )
  14. ( 4 5 )
  15. x
  16. 0

样例输出

  1. tree edges: <-1,A> <A,B> <B,D> <D,C> <B,F> <F,E>
  2. visit sequence: A B D C F E

开始你的任务吧,祝你成功!

//Graph
///
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "Graph.h"
/
Graph* Graph_Create(int n)
{Graph* g=(Graph*)malloc(sizeof(Graph));g->n=n;g->vetex=(char**)malloc(sizeof(char*)*n);int i;for (i=0; i<n; i++) g->vetex[i] = NULL;g->adj=(int*)malloc(sizeof(int)*n*n);int j;for(i=0; i<n; i++) {for(j=0; j<n; j++) {g->adj[i*n+j]=0;}}return g;
}void Graph_Free(Graph* g)
{free(g->adj);int i;for (i=0; i<g->n; i++) free(g->vetex[i]);free(g->vetex);free(g);
}int Graph_DepthFirst(Graph*g, int start, Edge* tree)
//从start号顶点出发深度优先遍历,(编号从开始)
//返回访问到的顶点数,
//tree[]输出遍历树
//返回的tree[0]是(-1, start),
//真正的遍历树保存在tree[1..return-1], return是返回值
//顶点的访问次序依次为tree[0].to, tree[1].to, ..., tree[return-1].to
//输入时,tree[]的长度至少为顶点数
//返回值是从start出发访问到的顶点数
{/*请在BEGIN和END之间实现你的代码*//*****BEGIN*****/const int MAX=1000;Edge queue[MAX];int top=-1;
#define In__(a,b)  {top++;queue[top].from=a; queue[top].to=b;}
#define Out__(a,b)  {a=queue[top].from; b=queue[top].to;top--;}
#define QueueNotEmpty (top>=0?1:0)
#define HasEdge(i,j)  (g->adj[(i)*g->n+(j)]==1)char* visited=(char*)malloc(sizeof(char)*g->n);memset(visited, 0, sizeof(char)*g->n);int parent=-1; int curr=start;In__(parent, curr); int k=0; while(QueueNotEmpty) {Out__(parent, curr);if (visited[curr])continue; visited[curr]=1; tree[k].from=parent;tree[k].to=curr;k++;int j;for(j=g->n-1;j>=0;j--)//约定编号大的先进栈{if(HasEdge(curr,j)&&!visited[j])In__(curr,j);}}return k;
#undef In__
#undef Out__
#undef QueueNotEmpty
#undef HasEdge/*****END*******/
}

educoder数据结构与算法 图 第2关:实现图的深度优先遍历相关推荐

  1. 数据结构与算法学习④(哈夫曼树 图 分治回溯和递归)

    数据结构与算法学习④(哈夫曼树 图 回溯和递归 数据结构与算法学习④ 1.哈夫曼树 1.1.相关概念 1.2.哈夫曼树的构建 1.3.哈夫曼编码 1.4.面试题 2.图 2.1.图的相关概念 2.2. ...

  2. 【Java数据结构与算法】第十六章 图

    第十六章 图 文章目录 第十六章 图 一.图 1.介绍 2.基本术语 3.邻接矩阵 4.邻接表和逆邻接表 5.十字链表 二.深度优先遍历 三.广度优先遍历 四.代码实现 一.图 1.介绍 图相较于前面 ...

  3. 左神数据结构与算法(基础)——表、树、图、贪心、递归

    2.1 哈希表.有序表.单链表和双链表 ①哈希表的简单介绍 1>哈希表在使用层面可以理解为一种集合结构. 2>如果只有key,没有伴随数据value,可以使用HashSet结构 3> ...

  4. 【数据结构与算法】详解什么是图结构,并用代码手动实现一个图结构

    本系列文章[数据结构与算法]所有完整代码已上传 github,想要完整代码的小伙伴可以直接去那获取,可以的话欢迎点个Star哦~下面放上跳转链接 https://github.com/Lpyexplo ...

  5. [数据结构与算法] 学习记录合辑 (07) 图

    该合辑为笔者自b站自学的"C++数据结构与算法"课程学习记录,旨在将重要的学习要点.思考内容与部分代码进行记录,以便后续自行翻看,亦可给其他读者带来一些参考 内容基于笔者自身的理解 ...

  6. 数据结构与算法王卓-习题-第六章图-采用邻接矩阵表示图的深度优先搜索遍历(DFS)算法

    目录 算法描述 算法预期效果 重难点 思路 个人解法 测试样例与输出 算法描述 创建图的邻接矩阵, 并输出dfs深度优先搜索遍历结果 算法预期效果 依次输入顶点数,边数,顶点V1~Vn,边A1~An, ...

  7. educoder数据结构与算法 线性表 第1关:实现一个顺序存储的线性表

    任务描述 本关任务:实现 step1/Seqlist.cpp 中的SL_InsAt.SL_DelAt和SL_DelValue三个操作函数,以实现线性表中数据的插入.删除与查找等功能. 相关知识 线性表 ...

  8. educoder数据结构与算法 线性表 第2关:实现一个链接存储的线性表

    任务描述 本关任务:完成一个链接存储的线性表的小程序. 相关知识 线性表的存储也可以采用链接存储方式来实现.链接存储方式包括单链表.双链表和循环链表等形式. 下面描述了一种基于单链表的线性表实现方案: ...

  9. 《数据结构与算法》(十四)- 图的应用:最短路径

    目录 前言 1. 最短路径 1.1 迪杰斯特拉(Dijkstra)算法 1.2 佛洛依德(Floyd)算法 2. 总结 原文地址:https://program-park.github.io/2021 ...

最新文章

  1. 04Strategy(策略)模式
  2. Docker(八):Docker Compose
  3. W3C宣布成立Web性能工作组
  4. php self this parent
  5. 黄金点游戏之客户端(homework-05)
  6. 小马智行Pony.ai 2020校招正式开启
  7. php的socket通信
  8. Nginx七层负载均衡的案例
  9. Centos下mysql数据库备份与恢复的方法
  10. C++学习笔记系列之继承多态
  11. 10.Hello World 的 Java 项目创建和项目配置文件讲解
  12. 回顾华为荣耀6手机刷机相关
  13. 全志V3S学习笔记(二)PCF8563
  14. Face2Face: Real-time Face Capture and Reenactment of RGB Videos 论文翻译
  15. 北京软件开发公司排名-最大的软件开发公司有哪些呢
  16. 怎样促进计算机专业发展,【计算机教学论文】怎样促进计算机技术应用及改善(共4879字)...
  17. 卷积神经网络demo
  18. C语言学习记录——유 分支与循环(2)
  19. 傻瓜攻略(九)——MATLAB实现简单的多元线性回归(以炼钢转炉炉龄问题为例)
  20. 饥荒机器人雷击_饥荒17版本最强人物 机器人解读

热门文章

  1. 一个人瘦到什么程度身材才算好?其实身材好与体重关系不大
  2. Pytorch深度学习(五):加载数据集以及mini-batch的使用
  3. 使用route查看路由表,添加/删除默认路由网关
  4. 基于51单片机的温度监测控制系统仿真程序原理图设计
  5. 与汇编语言相比c语言,汇编语言与C语言有什么区别
  6. 虚拟机关机/重启后都要重装虚拟机的操作系统
  7. C#代码CRUD操作MySQL数据库
  8. 语音信号a率压缩算法c语言,基于OMAP5912平台的语音压缩算法实现
  9. python+django+layUI+MySQL+TSC打印机搭建4G设备管理平台项目(二)——过程中的难点记录
  10. Cocos2d-x2.1.1-ClippingNodeTest 深入分析