实验四 图的遍历算法设计与实现

一、实验名称:图的遍历算法设计与实现

二、实验目的:

1.掌握图的深度优先遍历的算法。

2.掌握图的广度优先遍历的算法。

3.实验章节:算法设计与分析 第四章

三、实验内容。实验问题和程序运行结果

第一部分 广度优先遍历算法

完善下列程序,并回答问题。

  1 #include <iostream.h>
  2 #define QSize 30
  3 template<class T>  //队列
  4 class Queue
  5 {
  6 public:
  7     Queue(){data = new T[30]; Qsize = 30;InitQueue();};
  8     Queue(int size){Qsize = size; data = new T[Qsize];InitQueue();};
  9     void InitQueue(){            //初始化队列
 10         front = rear = 0;
 11     };
 12     void Append(T e){            //入队操作
 13         if((rear+1)%Qsize==front) cout<<"队列已满";
 14         else 
 15         {
 16             data[rear]=e;
 17             rear=(rear+1)%Qsize;
 18          }
 19     };
 20     T Front(){        //出对操作
 21         if(IsEmpty())  return -1;
 22         T e =data[front];
 23         front=(front+1)%Qsize;
 24         return e;
 25     };                    
 26     void Serve(){return;};
 27     int IsEmpty(){                //判定是否为空
 28         if(front==rear) return 1;
 29         return 0;
 30     };
 31 private:
 32     T* data;
 33     int front;
 34     int rear;
 35     int Qsize;
 36 };
 37 
 38 enum ColorType{White,Gray,Black};
 39 struct ENode
 40 {
 41     int adjVex;
 42     ENode* nextArc;
 43 };
 44 class Graph
 45 {
 46 public:
 47     Graph(int mSize){
 48         n = mSize;
 49         a = new ENode* [n];
 50         for(int i = 0; i<n;i++) a[i] = NULL;
 51     }
 52     void DFS_Traversal(int* parent);
 53     void BFS_Traversal(int* parent);
 54     void input(int data[][7], int lenth){
 55         ENode *t;
 56         ENode *newNode;
 57         for(int i = 0; i< n; i++){
 58             t = a[i];
 59             for(int j = 0; j<lenth ;j++){
 60                 if(data[i][j] >=0 && data[i][j] <= n-1){
 61                     newNode = new ENode();
 62                     newNode->adjVex = data[i][j];
 63                     newNode->nextArc = NULL;
 64                     if(t == NULL && a[i] == NULL){
 65                         a[i] = newNode;
 66                         t=newNode;
 67                     }else{
 68                         t->nextArc = newNode;
 69                         t=newNode;
 70                     }
 71                 }else{
 72                     break;
 73                 }
 74             }
 75         }
 76     }
 77     void output(){
 78         ENode *t;
 79         for(int i = 0; i < n; i++){
 80             cout<<endl<<"  节点"<<i<<"连接的节点";
 81             t=a[i];
 82             while(t!=NULL){
 83                 cout<<"->"<<t->adjVex;
 84                 t = t->nextArc;
 85             }
 86         }
 87     }
 88 protected:
 89     void DFS(int u, int *parent, ColorType* color);
 90     void BFS(int u, int *parent, ColorType* color);
 91     ENode** a;
 92     int n;
 93 };
 94 
 95 void Graph::BFS_Traversal(int* parent)
 96 {
 97     //学生完成部分
 98 }
 99 
100 void Graph::BFS(int u, int* parent, ColorType* color)
101 { 
102     //学生完成部分
103 }
104 
105 void main(){
106     int data[7][7]={{ 1,-1,-1,-1,-1,-1,-1},
107                     { 6, 3, 2,-1,-1,-1,-1},
108                     { 0,-1,-1,-1,-1,-1,-1},
109                     { 2, 0,-1,-1,-1,-1,-1},
110                     { 6, 5,-1,-1,-1,-1,-1},
111                     { 1,-1,-1,-1,-1,-1,-1},
112                     { 5, 3,-1,-1,-1,-1,-1}};
113     Graph *G = new Graph(7);
114     G->input(data,7);
115     G->output();
116     cout<<endl;
117     int parent[30];
118     G->BFS_Traversal(parent);
119 }

 

补充后的代码如下:

  1 #include <iostream.h>
  2 #define QSize 30
  3 template<class T>  //队列
  4 class Queue
  5 {
  6 public:
  7     Queue(){data = new T[30]; Qsize = 30;InitQueue();};
  8     Queue(int size){Qsize = size; data = new T[Qsize];InitQueue();};
  9     void InitQueue(){            //初始化队列
 10         front = rear = 0;
 11     };
 12     void Append(T e){            //入队操作
 13         if((rear+1)%Qsize==front) cout<<"队列已满";
 14         else 
 15         {
 16             data[rear]=e;
 17             rear=(rear+1)%Qsize;
 18          }
 19     };
 20     T Front(){        //出对操作
 21         if(IsEmpty())  return -1;
 22         T e =data[front];
 23         front=(front+1)%Qsize;
 24         return e;
 25     };                    
 26     void Serve(){return;};
 27     int IsEmpty(){                //判定是否为空
 28         if(front==rear) return 1;
 29         return 0;
 30     };
 31 private:
 32     T* data;
 33     int front;
 34     int rear;
 35     int Qsize;
 36 };
 37 
 38 enum ColorType{White,Gray,Black};
 39 struct ENode
 40 {
 41     int adjVex;
 42     ENode* nextArc;
 43 };
 44 class Graph
 45 {
 46 public:
 47     Graph(int mSize){
 48         n = mSize;
 49         a = new ENode* [n];
 50         for(int i = 0; i<n;i++) a[i] = NULL;
 51     }
 52     void DFS_Traversal(int* parent);
 53     void BFS_Traversal(int* parent);
 54     void input(int data[][7], int lenth){
 55         ENode *t;
 56         ENode *newNode;
 57         for(int i = 0; i< n; i++){
 58             t = a[i];
 59             for(int j = 0; j<lenth ;j++){
 60                 if(data[i][j] >=0 && data[i][j] <= n-1){
 61                     newNode = new ENode();
 62                     newNode->adjVex = data[i][j];
 63                     newNode->nextArc = NULL;
 64                     if(t == NULL && a[i] == NULL){
 65                         a[i] = newNode;
 66                         t=newNode;
 67                     }else{
 68                         t->nextArc = newNode;
 69                         t=newNode;
 70                     }
 71                 }else{
 72                     break;
 73                 }
 74             }
 75         }
 76     }
 77     void output(){
 78         ENode *t;
 79         for(int i = 0; i < n; i++){
 80             cout<<endl<<"  节点"<<i<<"连接的节点";
 81             t=a[i];
 82             while(t!=NULL){
 83                 cout<<"->"<<t->adjVex;
 84                 t = t->nextArc;
 85             }
 86         }
 87     }
 88 protected:
 89     void DFS(int u, int *parent, ColorType* color);
 90     void BFS(int u, int *parent, ColorType* color);
 91     ENode** a;
 92     int n;
 93 };
 94 
 95 void Graph::BFS_Traversal(int* parent)
 96 {
 97     //学生完成部分
 98     ColorType*color=new ColorType[n];
 99     cout<<endl<<"BFS";
100     for(int u=0;u<n;u++){
101         color[u]=White;
102         parent[u]=-1;
103     }
104     for(int u=0;u<n;u++){
105         if(color[u]==White)
106             BFS(u,parent,color);
107     }
108     delete[]color;
109     cout<<endl;
110 }
111 
112 void Graph::BFS(int u, int* parent, ColorType* color)
113 { 
114 
115     //学生完成部分
116     Queue<int> q(QSize);
117     color[u]=Gray;
118     cout<<" "<<u;
119     q.Append(u);
120     while(!q.IsEmpty()){
121         u=q.Front();
122         q.Serve();
123         for(ENode *w=a[u];w;w=w->nextArc){
124             int v=w->adjVex;
125             if(color[v]==White){
126                 color[v]=Gray;
127                 cout<<" "<<v;
128                 parent[v]=u;
129                 q.Append(v);
130             }
131         }
132         color[u]=Black;
133     }
134 }
135 
136 int main(){
137     int data[7][7]={{ 1,-1,-1,-1,-1,-1,-1},
138                     { 6, 3, 2,-1,-1,-1,-1},
139                     { 0,-1,-1,-1,-1,-1,-1},
140                     { 2, 0,-1,-1,-1,-1,-1},
141                     { 6, 5,-1,-1,-1,-1,-1},
142                     { 1,-1,-1,-1,-1,-1,-1},
143                     { 5, 3,-1,-1,-1,-1,-1}};
144     Graph *G = new Graph(7);
145     G->input(data,7);
146     G->output();
147     cout<<endl;
148     int parent[30];
149     G->BFS_Traversal(parent);
150 }

 

1. 分析Graph类,画出Graph类初始化以后的Graph对象的数据结构图。

2. 分析BFS函数,画出流程图。

3. 上述程序   int data[7][7]={{ 1,-1,-1,-1,-1,-1,-1},

                                   { 6, 3, 2,-1,-1,-1,-1},

                                   { 0,-1,-1,-1,-1,-1,-1},

                                   { 2, 0,-1,-1,-1,-1,-1},

                                   { 6, 5,-1,-1,-1,-1,-1},

                                   { 1,-1,-1,-1,-1,-1,-1},

                                   { 5, 3,-1,-1,-1,-1,-1}};

是对课本图4-1的输入,从0开始的广度优先的顺序是:

4. 若上图从节点4开始遍历的话,广度优先的顺序应该是什么。

5. 分析当Graph类对象,在输入以下图1的时候,从0开始的广度优先顺序是什么。自己设计data[][]数据进行输入,并给出该种输入情况下的遍历顺序。

 

 

6. 改写程序,输出parent数组值,并根据parent画出图1的广度优先深林。

第二部分 深度优先遍历算法

  1. 分析DFS程序,给出DFS的流程图:
  2. 对图4-1的DFS遍历顺序是:
  3. 当对图1进行DFS遍历的时候,遍历顺序是什么,根据parent值,推断深度优先深林是什么。
  4. 自己设计一个图,并通过程序计算深度遍历和广度遍历顺序。

 

四、实验小结和心得:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/298640.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

为什么魂斗罗只有128KB却可以实现那么长的剧情?

全世界只有3.14 % 的人关注了爆炸吧知识现代程序员A和1980年代游戏程序员B的对话&#xff1a;A&#xff1a;为什么你用128KB能实现这么多画面、音乐、动画&#xff1f;B&#xff1a;128KB还不够么&#xff1f;其实为了表现力已经相当奢侈了&#xff0c;加了很多不重要的细节。A…

asp.net core 6 新特性,支持HTTP/3 端点发布

???? 序言Http3 协议构建在UDP的基础上&#xff0c;是的&#xff0c;就这么神奇&#xff0c;以前被誉为不稳定大神的UDP&#xff0c;现在承担起可靠通讯协议的底层协议。为了消除UDP的不确定性&#xff0c;在UDP协议之上&#xff0c;新增了QUIC协议。使用QUIC协议代替TCP协…

浮点数赋值给整数_初学者专题:变量和赋值

作者&#xff1a;老齐对于初学Python者&#xff0c;除了看书(《跟老齐学Python&#xff1a;轻松入门》或者《Python大学实用教程》&#xff0c;均为电子工业出版社出版)、或者看视频(网易云课堂、CSDN上均有老齐的视频课程)&#xff0c;还要进行专题性总结。比如本文&#xff0…

分析android动画模块[转]

2019独角兽企业重金招聘Python工程师标准>>> 作者: 刘鹏 日期: 2009-03-07 Android 平台提供了两类动画&#xff0c;一类是 Tween 动画&#xff0c;即通过对场景里的对象不断做图像变换(平移、缩放、旋转)产生动画效果&#xff1b;第二类是 Frame 动画&#xff0c;即…

当你的手被502粘住了要怎么做?

1 看清楚&#xff0c;这是大裤衩子▼这才是 jk 裙▼2 天天看你们骂海王男友其实我有一个河神男友▼3 当你的手被502粘住了怎么办&#xff1f;▼4 不能指望食堂阿姨了自己动手丰衣足食▼5 当你被别人夸奖时▼6 宅在家里也能拍大片▼7 是我本人没错了▼你点的每个赞&#…

excel 如何替换带上标的文字_如何在Excel中批量提取中文汉字和英文字母

1. 在数据源的右边分别命名新的两列为“中文名”和“英文名”&#xff0c;然后将数据源复制到“中文名”这一列。2. 为了确保英文名字可以连在一起&#xff0c;这里我们在有空格的英文名字中间添加一个“-”。选择“中文名”下所有数据源&#xff0c;按CtrlF&#xff0c;点击“…

国内最大.NET平台重金招募中 你竟然还不知道?

各位路过的捎带眼瞅见的不小心翻到的英雄好汉请留步~让小编来带你康康这个胆敢号称国内最大的.NET的平台到底有何惊人之处一难道是因为它有--“最敢”的生态开放平台技术驱动商业创新&#xff0c;数字引领企业的未来&#xff0c;明源云通过多年专业积累&#xff0c;融合多种创新…

GChemPaint-绘制化学分子布局

Toy Posted in AppsRSSTrackbackGChemPaint 是专门用来绘制 2D 的化学分子布局软件&#xff0c;它合用于 GNOME 桌面。经由历程它所绘制的化学分子布局可以被嵌入到其他的应用程序中。Download GChemPaint 0.7.91版权声明&#xff1a; 原创作品&#xff0c;允许转载&#xff0c…

软件开发有哪些规范和标准_深圳APP软件开发的流程是什么?

深圳APP软件开发的流程是什么&#xff1f;APP软件开发是根据用户需求构建软件系统或设备的软件部分的过程&#xff0c;是一项系统工程&#xff0c;包括需求捕获&#xff0c;需求分析&#xff0c;系统设计&#xff0c;系统实现和系统测试。APP软件通常以某种编程语言实现&#x…

第十六周项目3-有相同数字?

输入两个数组中要存放的元素个数及元素值&#xff08;不超过50个&#xff09;&#xff0c;判断这两个数组中是否有相同的数字。 当两组数中有相同数字时&#xff0c;输出YES&#xff0c;否则&#xff0c;输出NO /* * Copyright (c) 2014,烟台大学计算机学院 * All right reserv…

一键对频对讲机好吗_对讲机的基础知识你都知道多少呢?

对讲机或PMR是手持式便携式无线电&#xff0c;可在单个共享频带上使用无线电波进行无线通信。这使Walkie Talkies成为以低成本与大范围人群保持联系的最有效方法之一。双向无线电功能强大&#xff0c;易于使用且易于使用。它们特别适合在户外或在手机或平板电脑过于精致或超出信…

女儿学会走路了,是不是该教她学Python了?

1 哈哈哈&#xff0c;20个人其实都是精准客户▼2 搬沙发一定不要穿的太正式&#xff01;▼3 横竖都是死让我先打完这场游戏先▼4 只要你学会这支舞你就是你妈的好朋友▼5 你能体会到这只阿拉斯加的惆怅吗&#xff1f;▼6 这双鞋一看就是全球限量有钱都买不到的那种▼7 我…

html游戏怎么做,HTML5 制做“游戏”的一个基本流程

怎样用HTML5 Canvas制作一个简单的游戏为了让大家清楚HTML5制作游戏的简单流程&#xff0c;所以先了制作一个非常简单的游戏&#xff0c;来看一看这个过程。游戏非常简单&#xff0c;无非就是英雄抓住怪物就得分&#xff0c;然后游戏重新开始&#xff0c;怪物出现在地图的随机位…

.NET 6 的 docker 镜像可以有多小

.NET 6 的 docker 镜像可以有多小?Intro最近写了一个小玩具&#xff0c;一个命令行调用 HTTP API 的工具&#xff0c;介绍可以参考&#xff1a;动手造轮子 —— dotnet-HTTPie&#xff0c;最近在使用 System.CommandLine 重构的同时&#xff0c;也在尝试减少 docker 镜像的大小…

开源播放器 Banshee 发布 1.0 beta 2

Banshee也是个很是不错的开源播放器,同时也是SuSE的内置播放器,默许支持靠山播放,消息区域告诉,可以快速跳过以后曲目,评分等等,也支持全局热键,媒体库支持音频和视频.新版本提供了对网络视频和PodCast的优秀支持.SuSE/Ubuntu/Fedora Linux用户可以从源中直接安置,也可以下载安…

仓库每天的账怎样做_新年第一站,济南:仓储匠人仓库问题解决与实战力培训...

【时间地点】1月15-16日&#xff0c;济南站济南市天桥区无影山北路88号祥云酒店5楼(师范路西口)【报名方式】直接加微信号“taishan33976”&#xff0c;注明姓名公司名仓储匠人。如果您认识小编的任意一位同事&#xff0c;欢迎直接找他们报名。【培训价格】1960元/人&#xff0…

一对一指导怎么追喜欢的男生

1 它们是怎样达成平衡的2 OK. 对不起打扰了3 今天也要加油鸭&#xff01;4 以色列一个父亲&#xff0c;为她“坐没坐相”的女儿打造的椅子。5 这个床我爱了6 静冈花火大会上摄影师发现了一个有趣的角度7 怎么样学会了吗内容自奔现翻车现场你点的每个赞&#xff0c;我都认真当成…

android canvas_Android 如何实现气泡选择动画

作者&#xff1a;Irina Galata Android 开发者: Yulia Serbenenko UI/UX 设计师 译者&#xff1a;skyar2009链接&#xff1a;https://juejin.im/post/58e5ec838d6d8100616d82e2/跨平台用户体验统一正处于增长趋势&#xff1a;早些时候 iOS 和安卓有着不同的体验&#xff0c;但是…

MVC中的验证规则

前面的博客中曾经提到过ModelBing机制&#xff0c;也在Demo中体现过&#xff0c;在MVC中更吊的是封装了自定义的验证规则。下面来一个Demo来展现一下&#xff0c;看了后&#xff0c;你一定会爱上它的&#xff0c;能让你少写很多JS语句。 1.View层 [html] view plaincopyprint…

网络——在网络上发送,接收数据

问题 创建并加入一个网络会话是一回事&#xff0c;但如果不能发送或接收任何数据那么网络会话有什么用呢&#xff1f; 解决方案 当玩家连接到会话时&#xff0c;你可以在一个PacketWriter流中存储所有想要发送的数据。完成这个操作后&#xff0c;你可以使用LocalNetworkPlayer.…