1.分别实现有向图的邻接矩阵和邻接表存储结构的建立算法,分析和比较各建立算法的时间复杂度以及存储结构的空间占用情况。

逆邻接矩阵:

//邻接矩阵
typedef struct {char vertex[V_Number];//顶点表int edge[V_Number][V_Number];//边表int n;//顶点数int e;//边数
}MTGraph;
void CreatMTGragh(MTGraph* G)//构建有向图的逆邻接矩阵表
{cout << "输入顶点数和边数" << endl;cin >> G->n>> G->e;cout << "输入顶点信息" << endl;for (int i = 0; i < G->n; i++)cin >> G->vertex[i];for (int i = 0; i < G->n; ++i)for (int j = 0; j < G->n; ++j)G->edge[i][j] = 0;//初始化cout << "读入e条边建立邻接矩阵,分别输入tail、head、weight" << endl;for (int k = 0; k < G->e; k++) {int i, j, w;cin >> i >> j >> w;//输入边(i,j)上的权值G->edge[i][j] = w;}
}

邻接矩阵建立算法的时间复杂度为O(n2+n+e) 空间复杂度为O(n+n2)

逆邻接表:

//逆邻接表
typedef struct node {//边表int adjvex;//邻接点域int cost;//边上的权值struct node* next;//下一边链接指针
}EdgeNode;
typedef struct {//顶点表节点char vertex;//顶点数据域EdgeNode* firstedge;//边链表头指针
}VertexNode;
typedef struct {//图的邻接表VertexNode vexlist[V_Number];int n;int e;
}AdjGraph;void CreateGraph(AdjGraph* G) {//建立有向图逆邻接表cout << "输入顶点数和边数" << endl;cin >> G->n >> G->e;cout << "输入顶点信息" << endl;for (int i = 0; i < G->n; ++i) {cin >> G->vexlist[i].vertex;G->vexlist[i].firstedge = NULL;//边表置为空表}int tail, head, weight;EdgeNode* temp;cout << "读入e条边建立邻接矩阵,分别输入tail、head、weight" << endl;for (int i = 0; i < G->e; ++i) {//逆邻接矩阵表cin >> tail >> head >> weight;EdgeNode *p= new EdgeNode;//头插法p->adjvex = head;p->cost = weight;p->next = G->vexlist[tail].firstedge;G->vexlist[tail].firstedge = p;}
}

邻接表建立算法的时间复杂度为O(n+e) 空间复杂度为O(n+e)

2.实现有向图的邻接矩阵和邻接表两种存储结构的相互转换算法。

示例有向图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-t9czIL9I-1677332191110)(未命名.assets/图片2.png)]

邻接矩阵转换为邻接表:

测试代码

int main() {MTGraph* G = new MTGraph;AdjGraph* A = new AdjGraph;int in[V_Number] = { 0 };int out[V_Number] = { 0 };CreatMTGragh(G);cout << "邻接矩阵:" << endl;printm(G);cout << "转换后" << endl;A = TransToAdj(G);printa(A);}

结果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-u2W9oUPs-1677332191110)(未命名.assets/图片6.png)]

3.在上述两种存储结构上,分别实现有向图的深度优先搜索(递归 和非递归)和广度优先搜索算法。并以适当的方式存储和展示相应的搜索结果, 包括:深度优先或广度优先生成森林(或生成树)、深度优先或广度优先序列 和深度优先或广度优先编号。并分析搜索算法的时间复杂度和空间复杂度。

使用的栈类:

#define maxlength  10000class MyStack {
public:MyStack();void MakeNull();//将栈置空void Push(int x);//进栈int Pop();//出栈bool Empty();//判断栈是否为空int Top();public:int stk[maxlength];//用于存放横坐标、纵坐标int top;//用于记录栈顶
};

使用的队列类:

#define Max  1000class Queue {//尾进头出
public:Queue();//无参构造初始化队列bool Empty();void EnQueue(int x);int DeQueue();public:int front;int rear;int d[Max];
};
int dfn[V_Number];//顶点的先深编号
bool visited[V_Number];//访问标记数组
void visitm(MTGraph* G, int i) {//按下标访问逆邻接矩阵的顶点表cout << G->vertex[i] << " ";
}
void visita(AdjGraph* G, int i) {//按下标访问邻接表的顶点表cout << G->vexlist[i].vertex << " ";
}//邻接矩阵的递归深度优先搜索
void DFSMR1(MTGraph* G, int i, int& count) {//从一个顶点出发的一次深度优先遍历算法visitm(G, i);visited[i] = true;//标记为访问过dfn[i] = count++;//对i顶点进行编号for (int j = 0; j < G->n; ++j) {if (G->edge[i][j] && (!visited[j])) {//找到下一个未被访问的邻接点DFSMR1(G, j, count);}}
}
void DFSMre(MTGraph* G) {//主算法int count = 1;for (int i = 0; i < G->n; ++i) {visited[i] = false;//标记数组初始化}for (int i = 0; i < G->n; ++i) {if (!visited[i])DFSMR1(G, i, count);//从顶点i出发的一次搜索}
}//邻接表的递归深度优先搜索
void DFSAR1(AdjGraph* G, int i, int& count) {//从一个顶点出发的一次深度优先遍历算法EdgeNode* p;visita(G, i);visited[i] = true;dfn[i] = count++;//对i顶点进行编号p = G->vexlist[i].firstedge;while (p) {//有相邻边if (!visited[p->adjvex])//未访问过DFSAR1(G, p->adjvex, count);//访问该相邻点p = p->next;}
}
void DFSAre(AdjGraph* G) {//主算法int count = 1;for (int i = 0; i < G->n; ++i) {visited[i] = false;//标记数组初始化}for (int i = 0; i < G->n; ++i) {if (!visited[i])DFSAR1(G, i, count);//从顶点i出发的一次搜索}
}
//邻接矩阵的非递归深度优先搜索
void DFSM1(MTGraph* G, int i, int& count) {//从一个顶点出发的一次深度优先遍历算法MyStack S;S.Push(i);//进栈visitm(G, i);visited[i] = true;//标记为访问过dfn[i] = count++;//对i顶点进行编号for (int j = 0;;) {if (j == G->n) {if (S.Empty())break;//栈空退出i=S.Pop();j = 0;}if (G->edge[i][j] && !visited[j]) {visited[j] = true;visitm(G, j);dfn[j] = count++;S.Push(j);i = j;//从j开始j = -1;}++j;}
}
void DFSM(MTGraph* G) {//主算法int count = 1;for (int i = 0; i < G->n; ++i) {visited[i] = false;//标记数组初始化}for (int i = 0; i < G->n; ++i) {if (!visited[i])DFSM1(G, i, count);//依次访问顶点}
}
//邻接表的非递归深度优先搜索
void DFSA1(AdjGraph* G, int i, int& count) {//从一个顶点出发的一次深度优先遍历算法MyStack S;S.Push(i);visita(G, i);visited[i] = true;dfn[i] = count++;//对i顶点进行编号while (1) {EdgeNode* p = G->vexlist[i].firstedge;while (p) {if (!visited[p->adjvex]) {S.Push(p->adjvex);visita(G, p->adjvex);visited[p->adjvex] = true;dfn[p->adjvex] = count++;if (G->vexlist[p->adjvex].firstedge)//下一个顶点p = G->vexlist[p->adjvex].firstedge;elsep = p->next;}elsep = p->next;}if (S.Empty())break;i=S.Pop();}
}
void DFSA(AdjGraph* G) {//主算法int count = 1;for (int i = 0; i < G->n; ++i) {visited[i] = false;}for (int i = 0; i < G->n; ++i) {if (!visited[i])DFSA1(G, i, count);}
}int bfn[V_Number];//顶点的先深编号
//邻接矩阵的广度优先遍历
void BFSM1(MTGraph* G, int i, int& count) {//从一个顶点出发的一次广度优先遍历算法Queue Q;//初始化队列visited[i] = true;visitm(G, i);bfn[i] = count++;Q.EnQueue(i);//顶点入队while (!Q.Empty()) {//队空搜索结束int i;i = Q.DeQueue();for (int j = 0; j < G->n; j++) {if (G->edge[i][j] && !visited[j]) {visitm(G, j);//访问jvisited[j] = true;bfn[j] = count++;Q.EnQueue(j);}}}
}
void BFSM(MTGraph* G) {//主算法int count = 1;for (int i = 0; i < G->n; ++i) {visited[i] = false;//标记数组初始化}for (int i = 0; i < G->n; ++i) {if (!visited[i]) {BFSM1(G, i, count);}}}
//邻接表的广度优先遍历
void BFSA1(AdjGraph* G, int i, int& count) {//从一个顶点出发的一次广度优先遍历算法EdgeNode* p;Queue Q;visita(G, i);visited[i] = true;bfn[i] = count++;Q.EnQueue(i);while (!Q.Empty()) {int i;i = Q.DeQueue();p = G->vexlist[i].firstedge;while (p) {if (!visited[p->adjvex]) {visita(G, p->adjvex);visited[p->adjvex] = true;bfn[p->adjvex] = count++;Q.EnQueue(p->adjvex);}p = p->next;}}}
void BFSA(AdjGraph* G) {//主算法int count = 1;for (int i = 0; i < G->n; ++i) {visited[i] = false;//初始化标记数组}for (int i = 0; i < G->n; ++i) {if (!visited[i]) {BFSA1(G, i, count);}}
}

邻接矩阵的深度优先搜索时间复杂度为O(n2

表的深度优先搜索时间复杂度为O(n+e)

4.对于有向图,采用“邻接表”存储结构,设计和实现计算每个顶点入度、 出度和度的算法,并分析其时间复杂度。

void DU(AdjGraph* A, int in[], int out[]) {EdgeNode* p;for (int i = 0; i < A->n; ++i) {p = A->vexlist[i].firstedge;while (p) {in[i]++;out[p->adjvex]++;p = p->next;}}
}

时间复杂度为O(n+e)

5.以适当的方式输入图的顶点和边,并显示相应的结果。要求顶点不少于 10 个,边不少于 13 条。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-As94WU2W-1677332191111)(未命名.assets/图片2.png)]

完成实验目标345

测试代码:

int main() {MTGraph* G = new MTGraph;AdjGraph* A = new AdjGraph;int in[V_Number] = { 0 };int out[V_Number] = { 0 };CreatMTGragh(G);cout << "邻接矩阵:" << endl;printm(G);cout << "转换后" << endl;A = TransToAdj(G);printa(A);cout << "广度优先遍历序列:" << endl;BFSM(G);cout << endl;cout << "广度优先编号:" << endl;for (int i = 0; i < G->n; ++i) {cout << bfn[i] << " ";}cout << endl;cout << "深度优先搜索序列为:" << endl;DFSMre(G);cout << endl;cout << "深度优先编号为:" << endl;for (int i = 0; i < G->n; ++i) {cout << dfn[i] << " ";}cout << endl;DU(A, in, out);cout << "各顶点入度为:" << endl;for (int i = 0; i < A->n; ++i) {cout << in[i] << " ";}cout << endl;cout << "各顶点出度为:" << endl;for (int i = 0; i < A->n; ++i) {cout << out[i] << " ";}cout << endl;cout << "各顶点度为:" << endl;for (int i = 0; i < A->n; ++i) {cout << in[i] + out[i] << " ";}cout << endl;}

结果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-R92Od3Z1-1677332191111)(未命名.assets/图片7.png)]

<< " ";
}
cout << endl;
DU(A, in, out);
cout << “各顶点入度为:” << endl;
for (int i = 0; i < A->n; ++i) {
cout << in[i] << " ";
}
cout << endl;
cout << “各顶点出度为:” << endl;
for (int i = 0; i < A->n; ++i) {
cout << out[i] << " ";
}
cout << endl;
cout << “各顶点度为:” << endl;
for (int i = 0; i < A->n; ++i) {
cout << in[i] + out[i] << " ";
}
cout << endl;

}


结果:[外链图片转存中...(img-R92Od3Z1-1677332191111)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KizxPlAR-1677332191111)(未命名.assets/图片8.png)]

HIT-哈工大数据结构-作业4(C++)相关推荐

  1. 一元多项式式计算器(哈工大数据结构实验)

    这是哈工大数据结构课的一个实验作业,试验结束了,终于可以发出来了. 实验要求: 实验 1 线性结构及其应用 实验项目:线性表的链式存储结构与应用 实验题目:一元多项式计算器 实验内容: 设计线性表的动 ...

  2. 哈工大计算机网络-作业讲解

    哈工大计算机网络作业 例题等来源于哈工大李全龙老师,李全龙老师YYDS 计算机网络笔记 我们知道分组交换网络中时延共有四种 处理时延 排队时延 传输时延 传播时延 详细讲解

  3. 数据结构作业之输出树的每一条从根节点到叶节点的路径

    数据结构作业,输出树的每一条从根节点到叶节点的路径 #include <stdio.h> #include <stdlib.h> typedef struct tree {ch ...

  4. 数据结构作业9(清览题库)

    数据结构作业9(清览题库) 主要涉及内容为:拓扑排序,关键路径,内排序等

  5. HIT暑假python作业三《超级画板》

    HIT暑假python作业三<超级画板> 作业上交版代码 编译版 程序运行效果**(运行时确保同目录下有文件夹img,里面有pen,eraser,plus,minus四个png图象,如果没 ...

  6. HIT CSAPP大作业论文

    计算机系统 大作业 题 目 程序人生-Hello's P2P 专 业 计算机类 学 号 1190201816 班 级 1903012 学 生 樊红雨 指 导 教 师 史先俊 计算机科学与技术学院 20 ...

  7. HIT计算机系统大作业2022

    计算机系统 大作业 计算机科学与技术学院 2021年5月 摘 要 学习计算机系统后,从底层对一个简单的Hello.c如何一步步编译,链接,加载,执行等进行浅层的描述. 关键词:计算机系统,底层. 目 ...

  8. HIT 计算机系统大作业 Hello程序人生P2P

    计算机系统 大作业 题 目 程序人生-Hello's P2P 专 业 人工智能(未来技术模块) 学 号 7203610725 班 级 2036014 学 生 黄鸿睿 指 导 教 师 刘宏伟 计算机科学 ...

  9. 【数据结构作业—01】用单循环链表解决约瑟夫问题

    实验作业一:线性表(链表) 1. 用单循环链表解决约瑟夫问题. 问题描述: 一个旅行社要从n个旅客中选出一名旅客,为他提供免费的环球旅行服务.旅行社安排这些旅客围成一个圆圈,从帽子中取出一张纸条,用上 ...

  10. 数据结构作业(校园导航系统)

    本人是一名暨南大学大二的学生,这是我的数据结构课程的一次编程作业,主要算法是弗洛伊德算法,希望各位大神多多指教. #include<stdio.h> #include<stdlib. ...

最新文章

  1. System.currentTimeMillis()竟然存在性能问题,这我能信?
  2. PCIe知识学习 (转载)
  3. PHP调试的时候遇到Warning: session_start() [function.session-
  4. Fragment全解析系列
  5. 【转】登录后自动显示未读快件
  6. java英文笔试题_java英文面试笔试题
  7. spring cloud构建互联网分布式微服务云平台- Netflix
  8. AppServ 介绍
  9. zabbix+telegram 报警
  10. CMU 15-213 Introduction to Computer Systems学习笔记(18) Dynamic Memory Allocation: Basic Concepts
  11. 基于微信小程序外卖点餐系统 开题报告
  12. cpuz测试分数天梯图_cpubenchmark(2020电脑cpu性能天梯图)
  13. Strick mode 和Trace View使用
  14. 22牛客多校day1 J - Serval and Essay 启发式合并
  15. ABeam Recruiting | ABeam旗下艾宾信息技术开发(西安) 2023届校招资讯大放送
  16. 快速的在Adobe Illustrator中创建羊驼插图教程
  17. Mac自带的邮件 添加邮箱 无法验证账户或密码【已解决】
  18. react native的WebView报错: Unable to open URL:****
  19. java中介系统平台_基于JAVA的房屋中介管理系统的设计与实现.ppt
  20. 未能找到类型或命名空间名称“DllImport“(是否缺少using指令或程序集引用?)

热门文章

  1. Vue项目在页面添加水印功能
  2. 快速了解区块链六大特点
  3. 揭秘Microsoft Windows LDM
  4. 实现表格内容第一行居中,其他行与第一行左对齐
  5. Kria K26 SOM 在 KV260 开发板上的使用
  6. 树莓派开发系列教程5——树莓派常用软件及服务(vi、远程桌面、ssh、samba、u盘)
  7. Python中Numpy中省略号的作用
  8. 什么是obj文件?obj文件详解
  9. 锂电池充电的同时也能放电吗?
  10. 微信小程序wx.downloadFile下载图片(甄姬)出现格式.unknown的bug