邻接表存储结构建立无向图

合集下载

计算机专业基础综合数据结构图历年真题试卷汇编4_真题无答案

计算机专业基础综合数据结构图历年真题试卷汇编4_真题无答案

计算机专业基础综合数据结构(图)历年真题试卷汇编4(总分58, 做题时间90分钟)6. 综合题1.已知一图如下图所示:(1)写出全部拓扑排序;(2)以V1为源点,以V8为终点,给出所有事件允许发生的最早时间和最晚时间,并给出关键路径;(3)求V1结点到各点的最短距离。

【北京邮电大学2000五(15分)】SSS_TEXT_QUSTI2.(1)对于有向无环图,叙述求拓扑有序序列的步骤;(2)对于以下的图,写出它的四个不同的拓扑有序序列。

【南开大学1998二(12分)】SSS_TEXT_QUSTI3.有向图的拓扑排序能否用图的深度搜索模式来查找?若能,请简述方法;若不能,请简述原因。

【西北大学2000二、8(5分)】SSS_TEXT_QUSTI4.下图是带权的有向图G的邻接表表示法,求:(1)以结点V1出发深度遍历图G 所得的结点序列;(2)以结点V1出发广度遍历图G所得的结点序列;(3)从结点V1到结点V8的最短路径;(4)从结点V1到结点V8的关键路径。

【中国海洋大学1999四(10分)】SSS_TEXT_QUSTI5.下表给出了某工程各工序之间的优先关系和各工序所需时间。

(1)画出相应的AOE网; (2)列出各事件的最早发生时间,最迟发生时间;(3)找出关键路径并指明完成该工程所需最短时间。

【山东大学2002七(15分)】【北京交通大学1995六(15分)】SSS_TEXT_QUSTI6.请写出应填入下列叙述中( )内的正确答案。

某一工程作业的网络图如图所示,其中箭头表示作业,箭头边的数字表示完成作业所需的天数。

箭头前后的圆圈表示事件,圆圈中的数字表示事件的编号。

用事件编号的序列(例如0一2—7—9一11)表示进行作业的路径。

完成此工程的关键路径是(A),完成此工程所需的最少天数为(B)天,此工程中具有最大充裕天数的事件是(C),充裕天数是(D)。

关键路径上的事件的充裕天数是(E)。

【上海大学2002三(10分)】SSS_TEXT_QUSTI7.求出下面AOE网中的关键路径(要求给出各个顶点的最早发生时间和最迟发生时间,并画出关键路径)。

邻接表存储结构建立无向图

邻接表存储结构建立无向图

//算法功能:采用邻接表存储结构建立无向图#include <stdio.h>#include <stdlib.h>#define OK 1#define NULL 0#define MAX_VERTEX_NUM 20 // 最大顶点数typedef int Status; //函数的类型,其值是函数结果状态代码typedef char VertexType;typedef int VRType;typedef int InforType;typedef struct ArcNode{int adjvex; //该边所指的顶点的位置struct ArcNode *nextarc; //指向下一条边的指针int weight; //边的权}ArcNode; //表的结点typedef struct VNode{VertexType data; //顶点信息(如数据等)ArcNode *firstarc; //指向第一条依附该顶点的边的弧指针}VNode, AdjList[MAX_VERTEX_NUM]; //头结点typedef struct ALGraph{AdjList vertices;int vexnum, arcnum; //图的当前顶点数和弧数}ALGraph;//返回顶点v在顶点向量中的位置int LocateVex(ALGraph G, char v){int i;for(i = 0; v != G.vertices[i].data && i < G.vexnum; i++);if(i >= G.vexnum)return -1;return i;}//构造邻接链表Status CreateUDN(ALGraph &G){int j;ArcNode *s, *t;printf("输入无向图顶点数: ");scanf("%d", &G.vexnum);printf("输入无向图边数: ");scanf("%d", &G.arcnum);getchar();for(int i = 0; i < G.vexnum; i++){printf("输入第%d个顶点信息:", i+1);scanf("%c", &G.vertices[i].data); //构造顶点向量G.vertices[i].firstarc = NULL;getchar();}char v1, v2;for(int k = 0; k < G.arcnum; k++){printf("输入第%d 条边依附的顶点v1: ", k+1);scanf("%c", &v1);getchar();printf("输入第%d 条边依附的顶点v2: ", k+1);scanf("%c", &v2);getchar();int i = LocateVex(G, v1);int j = LocateVex(G, v2); //确定v1 , v2在G中的位置s = (ArcNode*) malloc (sizeof(ArcNode));t = (ArcNode*) malloc (sizeof(ArcNode));s->adjvex = j; //该边所指向的顶点的位置为js->nextarc = G.vertices[i].firstarc;G.vertices[i].firstarc =s;t->adjvex = i; //该边所指向的顶点的位置为jt->nextarc = G.vertices[j].firstarc;G.vertices[j].firstarc =t;}return OK;}Status PrintAdjList(ALGraph &G){ArcNode *p;printf("%4s%6s%12s\n", "编号", "顶点", "相邻边编号");for(int i = 0; i < G.vexnum; i++){printf("%4d%6c", i, G.vertices[i].data);for(p = G.vertices[i].firstarc; p; p = p->nextarc)printf("%4d", p->adjvex);printf("\n");}return OK;}int main(){ALGraph G;CreateUDN(G);rintAdjList(G);return 0;}。

计算机学科专业基础综合数据结构-图(二)_真题-无答案

计算机学科专业基础综合数据结构-图(二)_真题-无答案

计算机学科专业基础综合数据结构-图(二)(总分100,考试时间90分钟)一、单项选择题(下列每题给出的4个选项中,只有一个最符合试题要求)1. 具有6个顶点的无向图至少应有______条边才能确保是一个连通图。

A.5 B.6 C.7 D.82. 设G是一个非连通无向图,有15条边,则该图至少有______个顶点。

A.5 B.6 C.7 D.83. 下列关于无向连通图特性的叙述中,正确的是______。

①所有顶点的度之和为偶数②边数大于顶点个数减1③至少有一个顶点的度为1A.只有① B.只有② C.①和② D.①和③4. 对于具有n(n>1)个顶点的强连通图,其有向边的条数至少是______。

A.n+1B.nC.n-1D.n-25. 下列有关图的说法中正确的是______。

A.在图结构中,顶点不可以没有任何前驱和后继 B.具有n个顶点的无向图最多有n(n-1)条边,最少有n-1条边 C.在无向图中,边的条数是结点度数之和 D.在有向图中,各顶点的入度之和等于各顶点的出度之和6. 对于一个具有n个顶点和e条边的无向图,若采用邻接矩阵表示,则该矩阵大小是______,矩阵中非零元素的个数是2e。

A.n B.(n-1)2 C.n-1 D.n27. 无向图的邻接矩阵是一个______。

A.对称矩阵 B.零矩阵 C.上三角矩阵 D.对角矩阵8. 从邻接矩阵可知,该图共有______个顶点。

如果是有向图,该图共有4条有向边;如果是无向图,则共有2条边。

A.9 B.3 C.6 D.1 E.5 F.4 G.2 H.09. 下列说法中正确的是______。

A.一个图的邻接矩阵表示是唯一的,邻接表表示也唯一 B.一个图的邻接矩阵表示是唯一的,邻接表表示不唯一 C.一个图的邻接矩阵表示不唯一,邻接表表示唯一 D.一个图的邻接矩阵表示不唯一,邻接表表示也不唯一10. 用邻接表存储图所用的空间大小______。

A.与图的顶点数和边数都有关 B.只与图的边数有关 C.只与图的顶点数有关 D.与边数的二次方有关11. 采用邻接表存储的图的深度优先搜索算法类似于二叉树的______,广度优先搜索算法类似于二叉树的层次序遍历。

数据结构-邻接表

数据结构-邻接表
for(i=0;i<NumOfVertices() ;i++) if(!visited[i]) BroadFirstSearch(i, visited, Visit);
delete [ ] visited; }
8.4 图的遍历(续)
图的生成树
定义:G的所有顶点加上遍历过程中经过的边 所构成的子图称作图G的生成树G’
visited[v]=1;
/*标记第v个顶点已访问*/
/*访问第v个顶点邻接的未被访问过的顶点w,并从w出发递归地按照深度 优先的方式进行遍历*/
w= GetFirstNeighbor (v); /*得到第v个顶点的第一个邻接顶点w*/
while(w!= -1)
{ if(!visited[w]) DepthFirstSearch(w,visited,Visit); //递归调用
void BroadFirstSearch(const int v, int visited[ ], void visit(VT Vertex));
public:
AdjTWGraph(void);
~AdjTWGraph(void);
int NumOfVertices(void)const;
int NumOfEdges(void)const;
(2) 无向图:第i个链表中的表结点数为TD(vi); 能逆求邻有I接向D表(图vi。):。第为i个便链于表求中ID的(v表i) 可结另点外数建为立OD有(v向i),图不的
(3) 容易寻找顶点的邻接 点,但判断两顶点间是 否有边或弧,需搜索两 结点对应的单链表。
(4) 邻接表多用于稀疏 图的存储(e<<n2)
void Visit(VT item))

数据结构作业答案第章图作业答案

数据结构作业答案第章图作业答案

第7章 图 自测卷解答 姓名 班级一、单选题(每题1分,共16分) 前两大题全部来自于全国自考参考书!( C )1. 在一个图中,所有顶点的度数之和等于图的边数的 倍。

A .1/2 B. 1 C. 2 D. 4 (B )2. 在一个有向图中,所有顶点的入度之和等于所有顶点的出度之和的 倍。

A .1/2 B. 1 C. 2 D. 4 ( B )3. 有8个结点的无向图最多有 条边。

A .14 B. 28 C. 56 D. 112 ( C )4. 有8个结点的无向连通图最少有 条边。

A .5 B. 6 C. 7 D. 8 ( C )5. 有8个结点的有向完全图有 条边。

A .14 B. 28 C. 56 D. 112 (B )6. 用邻接表表示图进行广度优先遍历时,通常是采用 来实现算法的。

A .栈 B. 队列C. 树D. 图 ( A )7. 用邻接表表示图进行深度优先遍历时,通常是采用 来实现算法的。

A .栈 B. 队列C. 树D. 图 ( )8. 已知图的邻接矩阵,根据算法思想,则从顶点0出发按深度优先遍历的结点序列是( D )9. 已知图的邻接矩阵同上题8,根据算法,则从顶点0出发,按深度优先遍历的结点序列是A . 0 2 4 3 1 5 6 B. 0 1 3 5 6 4 2 C. 0 4 2 3 1 6 5 D. 0 1 3 4 2 5 6 ( )10. 已知图的邻接矩阵同上题8,根据算法,则从顶点0出发,按广度优先遍历的结点序列是A . 0 2 4 3 6 5 1 B. 0 1 3 6 4 2 5 C. 0 4 2 3 1 5 6 D. 0 1 3 4 2 5 6 (建议:0 1 2 3 4 5 6) ( C )11. 已知图的邻接矩阵同上题8,根据算法,则从顶点0出发,按广度优先遍历的结点序列是A . 0 2 4 3 1 6 5 B. 0 1 3 5 6 4 2 C. 0 1 2 3 4 6 5 D. 0 1 2 3 4 5 6A .0 2 4 3 1 5 6B. 0 1 3 6 5 4 2C. 0 4 2 3 1 6 5D. 0 3 6 1 5 4 2建议:先画出图,再深度遍历⎥⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡0100011101100001011010110011001000110010011011110( A )12. 已知图的邻接表如下所示,根据算法,则从顶点0出发不是深度优先遍历的结点序列是A.0 1 3 2 B. 0 2 3 1C. 0 3 2 1D. 0 1 2 3(A)14. 深度优先遍历类似于二叉树的A.先序遍历 B. 中序遍历 C. 后序遍历 D. 层次遍历(D)15. 广度优先遍历类似于二叉树的A.先序遍历 B. 中序遍历 C. 后序遍历 D. 层次遍历(A)16. 任何一个无向连通图的最小生成树A.只有一棵 B. 一棵或多棵 C. 一定有多棵 D. 可能不存在(注,生成树不唯一,但最小生成树唯一,即边权之和或树权最小的情况唯一)二、填空题(每空1分,共20分)1. 图有邻接矩阵、邻接表等存储结构,遍历图有深度优先遍历、广度优先遍历等方法。

图练习与答案

图练习与答案

一、应用题1.首先将如下图所示的无向图给出其存储结构的邻接链表表示,然后写出对其分别进行深度,广度优先遍历的结果。

1题图答.深度优先遍历序列:125967384宽度优先遍历序列:123456789注:(1)邻接表不唯一,这里顶点的邻接点按升序排列(2)在邻接表确定后,深度优先和宽度优先遍历序列唯一(3)这里的遍历,均从顶点1开始2.给出图G:(1).画出G的邻接表表示图;(2).根据你画出的邻接表,以顶点①为根,画出G的深度优先生成树和广度优先生成树。

(3)宽度优先生成树3.在什么情况下,Prim算法与Kruskual算法生成不同的MST?答.在有相同权值边时生成不同的MST,在这种情况下,用Prim或Kruskal也会生成不同的MST4.已知一个无向图如下图所示,要求分别用Prim 和Kruskal 算法生成最小树(假设以①为起点,试画出构造过程)。

答.Prim 算法构造最小生成树的步骤如24题所示,为节省篇幅,这里仅用Kruskal 算法,构造最小生成树过程如下:(下图也可选(2,4)代替(3,4),(5,6)代替(1,5))5.G=(V,E)是一个带有权的连通图,则:(1).请回答什么是G 的最小生成树; (2).G 为下图所示,请找出G 的所有最小生成树。

28题图答.(1)最小生成树的定义见上面26题 (2)最小生成树有两棵。

(限于篇幅,下面的生成树只给出顶点集合和边集合,边以三元组(Vi,Vj,W )形式),其中W 代表权值。

V (G )={1,2,3,4,5} E1(G)={(4,5,2),(2,5,4),(2,3,5),(1,2,7)};E2(G)={(4,5,2),(2,4,4),(2,3,5),(1,2,7)}6.请看下边的无向加权图。

(1).写出它的邻接矩阵。

(2).按Prim 算法求其最小生成树,并给出构造最小生成树过程中辅助数组的各分量值。

辅助数组各分量值:7.已知世界六大城市为:(Pe)、纽约(N)、巴黎(Pa)、伦敦(L) 、东京(T) 、墨西哥(M),下表给定了这六大城市之间的交通里程:世界六大城市交通里程表(单位:百公里)(1).画出这六大城市的交通网络图;(2).画出该图的邻接表表示法;(3).画出该图按权值递增的顺序来构造的最小(代价)生成树.8.已知顶点1-6和输入边与权值的序列(如右图所示):每行三个数表示一条边的两个端点和其权值,共11行。

数据结构第七章课后习题答案 (1)

数据结构第七章课后习题答案 (1)

7_1对于图题7.1(P235)的无向图,给出:(1)表示该图的邻接矩阵。

(2)表示该图的邻接表。

(3)图中每个顶点的度。

解:(1)邻接矩阵:0111000100110010010101110111010100100110010001110(2)邻接表:1:2----3----4----NULL;2: 1----4----5----NULL;3: 1----4----6----NULL;4: 1----2----3----5----6----7----NULL;5: 2----4----7----NULL;6: 3----4----7----NULL;7: 4----5----6----NULL;(3)图中每个顶点的度分别为:3,3,3,6,3,3,3。

7_2对于图题7.1的无向图,给出:(1)从顶点1出发,按深度优先搜索法遍历图时所得到的顶点序(2)从顶点1出发,按广度优先法搜索法遍历图时所得到的顶点序列。

(1)DFS法:存储结构:本题采用邻接表作为图的存储结构,邻接表中的各个链表的结点形式由类型L_NODE规定,而各个链表的头指针存放在数组head中。

数组e中的元素e[0],e[1],…..,e[m-1]给出图中的m条边,e中结点形式由类型E_NODE规定。

visit[i]数组用来表示顶点i是否被访问过。

遍历前置visit各元素为0,若顶点i被访问过,则置visit[i]为1.算法分析:首先访问出发顶点v.接着,选择一个与v相邻接且未被访问过的的顶点w访问之,再从w 开始进行深度优先搜索。

每当到达一个其所有相邻接的顶点都被访问过的顶点,就从最后访问的顶点开始,依次退回到尚有邻接顶点未曾访问过的顶点u,并从u开始进行深度优先搜索。

这个过程进行到所有顶点都被访问过,或从任何一个已访问过的顶点出发,再也无法到达未曾访问过的顶点,则搜索过程就结束。

另一方面,先建立一个相应的具有n个顶点,m条边的无向图的邻接表。

判别无向图中任意两个顶点之间是否存在长度为K的简单路径

判别无向图中任意两个顶点之间是否存在长度为K的简单路径

目录一、问题描述 (2)二、设计思路 (2)三、测试用例设计 (3)四、详细设计 (3)五、调试分析 (5)六、心得体会 (8)七、参考文献 (10)八、附录 (10)九、课程设计评定表 (15)一、问题描述题目: 判别无向图中任意两个顶点之间是否存在长度为K的简单路径。

初始条件:(1)采用邻接表作为存储结构。

(2)编写程序判别无向图中任意给定的两个顶点之间是否存在一条长度为k的简单路径。

(3)测试用例自己设计。

注释:简单路径,即其顶点序列中不含有重现的顶点二、设计思路●存储结构设计1.采用邻接表作为无向图的存储结构,即顶点序列用一维数组描述,每个顶点所连接的边用单链表存储。

2.增设一个一维数组,用于存储搜索简单路径时所访问的节点。

●主要算法设计步骤:1.创建无向图CreateMGaph(MGraph &G)①输入无向图的顶点数、边数。

②给各个顶点命名,采用字符型编号。

③输入每条边所连接的两个顶点,即各顶点间的相通性初始化。

④每输入一条边,则判断其合法性:In(SList &L,char a)。

若输入的顶点对中出现了②中没有的新顶点,则提示相应的出错信息,重新输入一条新的边。

2. 打印出邻接表:void print(MGraph G)以每一个顶点为头指针,打印出与该顶点相邻的所有顶点。

然后换行,顺次打印下面的顶点及其相邻点。

3.搜索任意给出的两个顶点间是否存在长度为K的简单路径若搜索成功则返回成功标志,否则返回失败标志:int Search(MGraph G,int x,int y,int k)。

三.测试用例设计1.输入的顶点数:52.输入的边数;63.各顶点名称:A,B,C,D,E4.各条边所对应的顶点对:(A,D)(A,E)(D,E)(D,B)(C,B)(C,E)5.输入要寻找的顶点对及其简单路径长度分别为:(A,D),4四、详细设计4.1 存储结构说明4.1.1邻接表的存储表示#define MAX_VERTEX_NUM 20 //宏定义,最大顶点数typedef struct ArcNode{ //边表结点int adjvex;struct ArcNode *nextarc;}ArcNode;typedef struct VNode{ //头结点char data;ArcNode *firstarc;}VNode,AdjList[MAX_VERTEX_NUM];typedef struct{AdjList vertices;int n,e;}MGraph; //无向图4.1.2 标记访问过的顶点数组int visited[MAX_VERTEX_NUM]; //访问标志函数4.1.3 存储已访问过的顶点的数组int path[MAX_VERTEX_NUM];4.2 主要函数声明4.2.1 创建无向图void CreateMGaph(MGraph &G)4.2.2 寻找各个顶点的位置char GetValue(MGraph G,int i)4.2.3 判断新输入的顶点是否在图中int IsIn(MGraph G,char m)4.2.4 返回顶点的值char GetValue(MGraph G,int i)4.2.5 打印出邻接表void print(MGraph G)4.2.6 查找两顶点m,n之间是否存在长度为k的简单路径int Search(MGraph G,int x,int y,int k,int visited[],int path[],int d)4.3 主程序int main(){cout<<"--------------创建无向图------------"<<endl<<endl;CreateMGaph(G);cout<<"-----------打印邻接表----------------"<<endl<<endl;print(G);cout<<"----------------寻找长度为K的简单路径--------"<<endl<<endl;cout<<"寻找路径的两个顶点:";cin>>m>>n;cout<<"请输入想寻找的简单路径的长度:";cin>>k;Search(G,x,y,k,visited,path,-1);return 0;}五、调试分析5.1 程序的运行与调试5.1.1 设计程序所应考虑的因素该程序所要执行的操作是比较简单的,但细到微处却有很多要考虑的因素,如果不面面俱到,考虑全面,则会使运行过程过于简单,程序的功能不够完美。

数据结构邻接表实例

数据结构邻接表实例

数据结构邻接表实例邻接表是一种常用于表示图的数据结构,特别适用于稀疏图(图中的边相对较少的情况)。

下面是一个简单的无向图的邻接表实例,使用Python 语言表示:```pythonclass Graph:def __init__(self):self.adjacency_list = {}def add_vertex(self, vertex):if vertex not in self.adjacency_list:self.adjacency_list[vertex] = []def add_edge(self, vertex1, vertex2):# 无向图,所以边需要同时在两个顶点的邻接表中添加if vertex1 in self.adjacency_list and vertex2 in self.adjacency_list:self.adjacency_list[vertex1].append(vertex2)self.adjacency_list[vertex2].append(vertex1)def display(self):for vertex in self.adjacency_list:print(f"{vertex}: {self.adjacency_list[vertex]}")# 创建一个无向图graph = Graph()# 添加顶点graph.add_vertex("A")graph.add_vertex("B")graph.add_vertex("C")graph.add_vertex("D")# 添加边graph.add_edge("A", "B")graph.add_edge("B", "C")graph.add_edge("C", "D")graph.add_edge("D", "A")# 显示邻接表graph.display()```在上述代码中,`Graph` 类包含了三个方法:- `add_vertex`: 用于添加顶点到图中。

数据结构期末复习题及答案6

数据结构期末复习题及答案6

数据结构期末复习题及答案6数据结构期末考试试题及答案期末样卷参考答案⼀.是⾮题(每题1分共10分)1. 线性表的链式存储结构优于顺序存储结构。

F2. 栈和队列也是线性表。

如果需要,可对它们中的任⼀元素进⾏操作。

F3.字符串是数据对象特定的线性表。

T4.在单链表P指针所指结点之后插⼊S结点的操作是:P->next= S ; S-> next = P->next; F5.⼀个⽆向图的连通分量是其极⼤的连通⼦图。

T 6.邻接表可以表⽰有向图,也可以表⽰⽆向图。

T 7.假设B是⼀棵树,B′是对应的⼆叉树。

则B的后根遍历相当于B′的中序遍历。

T8.通常,⼆叉树的第i层上有2i-1个结点。

F9.对于⼀棵m阶的B-树,树中每个结点⾄多有m 个关键字。

除根之外的所有⾮终端结点⾄少有ém/2ù个关键字。

F10.对于任何待排序序列来说,快速排序均快于起泡排序。

F⼆.选择题(每题2分共28分)1.在下列排序⽅法中,(c )⽅法平均时间复杂度为0(nlogn),最坏情况下时间复杂度为0(n2);(d )⽅法所有情况下时间复杂度均为0(nlogn)。

a. 插⼊排序b. 希尔排序c. 快速排序d. 堆排序2. 在有n个结点的⼆叉树的⼆叉链表表⽰中,空指针数为( b )。

a.不定b.n+1c.nd.n-13. 下列⼆叉树中,(a )可⽤于实现符号不等长⾼效编码。

a.最优⼆叉树b.次优查找树c.⼆叉平衡树d.⼆叉排序树4. 下列查找⽅法中,(a )适⽤于查找有序单链表。

a.顺序查找b.⼆分查找c.分块查找d.哈希查找5. 在顺序表查找中,为避免查找过程中每⼀步都检测整个表是否查找完毕,可采⽤( a )⽅法。

a.设置监视哨b.链表存贮c.⼆分查找d.快速查找6. 在下列数据结构中,(c )具有先进先出特性,(b )具有先进后出特性。

a.线性表b.栈c.队列d.⼴义表7.具有m个结点的⼆叉排序树,其最⼤深度为(f ),最⼩深度为( b )。

第5课 图

第5课 图

第五课图一、选择题1.图中有关路径的定义是()。

A.由顶点和相邻顶点序偶构成的边所形成的序列B.由不同顶点所形成的序列C.由不同边所形成的序列D.上述定义都不是参考答案:A2.设无向图的顶点个数为n,则该图最多有()条边。

A.n-1 B.n(n-1)/2 C.n(n+1)/2 D.0 E.n2参考答案:B3.一个n个顶点的连通无向图,其边的个数至少为()。

A.n-1 B.n C.n+1 D.nlogn参考答案:A4.要连通具有n个顶点的有向图,至少需要()条边。

A.n-l B.n C.n+l D.2n参考答案:B5.n个结点的完全有向图含有边的数目()。

A.n*n B.n(n+1)C.n/2 D.n*(n-1)参考答案:D6.一个有n个结点的图,最少有()个连通分量。

A.0 B.1 C.n-1 D.n参考答案:B7.一个有n个结点的图,最多有()个连通分量。

A.0 B.1 C.n-1 D.n参考答案:D8.用有向无环图描述表达式(A+B)*((A+B)/A),至少需要顶点的数目为()。

A.5 B.6 C.8 D.9参考答案:A9.用DFS遍历一个无环有向图,并在DFS算法退栈返回时打印相应的顶点,则输出的顶点序列是()。

A.逆拓扑有序B.拓扑有序C.无序的参考答案:A10.下面结构中最适于表示稀疏无向图的是()。

A.邻接矩阵B.逆邻接表C.邻接多重表D.十字链表E.邻接表参考答案:C11.下列哪一种图的邻接矩阵是对称矩阵?()A.有向图B.无向图C.AOV网D.AOE网参考答案:B12.当一个有N个顶点的图用邻接矩阵A表示时,顶点Vi的度是()。

A.∑=nijiA1],[B.[]∑=n1jj,iAC.∑=nii jA1],[D.∑=nijiA1],[+[]∑=n1ji,jA参考答案:B13.下列说法不正确的是()。

A.图的遍历是从给定的源点出发每一个顶点仅被访问一次B.遍历的基本算法有两种:深度遍历和广度遍历C.图的深度遍历不适用于有向图D.图的深度遍历是一个递归过程参考答案:C14.无向图G=(V,E),其中:V={a,b,c,d,e,f},E={(a,b),(a,e),(a,c),(b,e),(c,f),(f,d),(e,d)},对该图进行深度优先遍历,得到的顶点序列正确的是()。

数据结构_图_采用邻接矩阵存储,构造无向图

数据结构_图_采用邻接矩阵存储,构造无向图

1.采用邻接矩阵(邻接表)存储,构造无向图(网)输入:顶点数、边数、顶点信息、边信息输出:图的顶点,图的边邻接矩阵(数组表示法)处理方法:用一个一维数组存储图中顶点的信息,用一个二维数组(称为邻接矩阵)存储图中各顶点之间的邻接关系。

假设图G=(V,E)有n个顶点,则邻接矩阵是一个n×n 的方阵,定义为:如果(vi,vj)属于边集,则edges[i][j]=1,否则edges[i][j]=0。

邻接表存储的处理方法:对于图的每个顶点vi,将所有邻接于vi的顶点链成一个单链表,称为顶点vi的边表(对于有向图则称为出边表),所有边表的头指针和存储顶点信息的一维数组构成了顶点表。

程序代码:#include<iostream>using namespace std;#define MAX_VERTEX_NUM 20 //最大顶点个数#define OK 1typedef int Status;//图的数组(邻接矩阵)存储表示typedef struct ArcCell { // 弧的定义int adj; // VRType是顶点关系类型。

// 对无权图,用1或0表示相邻否;// 对带权图,则为权值类型。

int *info; // 该弧相关信息的指针} ArcCell, AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];typedef struct { // 图的定义char vexs[MAX_VERTEX_NUM];//顶点向量AdjMatrix arcs; // 邻接矩阵int vexnum, arcnum; // 图的当前顶点数、弧数} MGraph;int LocateV ex(MGraph G, char v){int a;for (int i = 0; i <= G.vexnum; i++){if (G.vexs[i] == v)a= i;}return a;}Status CreateUDN(MGraph &G) { //采用邻接矩阵表示法,构造无向网Gint i, j, k, w;char v1, v2;cout <<"输入顶点数,边数:"<< endl;cin >> G.vexnum >> G.arcnum;//IncInfo为0,表示各弧无信息cout <<"各顶点分别为:"<< endl;for (i = 0; i<G.vexnum; i++)cin >> G.vexs[i]; //构造顶点向量for (i = 0; i<G.vexnum; i++) //初始化邻接矩阵for (j = 0; j<G.vexnum; j++){G.arcs[i][j].adj =NULL;}cout <<"顶点信息、边信息:"<< endl;for (k = 0; k<G.arcnum; k++) { //构造邻接矩阵cin >> v1 >> v2 >> w; //输入一条边依附的顶点及权值i = LocateV ex(G, v1); j = LocateV ex(G, v2);G.arcs[i][j].adj = w;G.arcs[j][i] = G.arcs[i][j];} return OK;} //CreateUDN (p162 算法7.2)Status printf1(MGraph G){cout <<"该图的顶点分别为:";for (int i = 0; i<G.vexnum; i++)cout << G.vexs[i] <<"";return OK;}Status printf2(MGraph G){cout <<"该图的边为:";for (int i = 1; i<G.vexnum; i++) //初始化邻接矩阵for (int j = 0; j<i; j++){if (G.arcs[i][j].adj !=NULL)cout << G.vexs[j]<< G.vexs[i] <<"," ;}return OK;}int main(){MGraph G;CreateUDN(G);printf1(G);cout << endl;printf2(G);cout << endl;system("pause");return 0;}。

邻接表和逆邻接表

邻接表和逆邻接表

邻接表和逆邻接表邻接表和逆邻接表是图论中常用的两种数据结构,它们分别用于存储有向图和无向图的邻居关系,是算法设计和优化中最常用的数据结构之一。

下面,我们将分别介绍邻接表和逆邻接表的定义、构建和应用。

一、邻接表邻接表是一种用于表示有向图和无向图的数据结构,实际上就是将图中的每个结点与其相邻结点关联起来,并存储在一个链表中。

因此,邻接表的基本结构是一个链表数组,其中每个链表代表一个结点和其邻居结点的关系。

邻接表一般可以通过以下步骤进行构建:1. 定义一个链表数组,数组的长度等于图中结点的个数;2. 遍历图中每个结点,将每个结点与其直接相连的结点添加到该结点对应的链表中;3. 添加完毕后,邻接表即构建完成。

邻接表的应用非常广泛,例如:1. 求解最短路径:通过遍历邻接表中的每个结点,可以找到从起点到终点的最短路径;2. 求解连通分量:通过遍历邻接表,可以找到有多少个连通分量,并输出每个连通分量的结点集合;3. 拓扑排序:通过邻接表和入度数组即可实现拓扑排序算法等等。

二、逆邻接表逆邻接表是指有向图中每个结点的入度集合,即表示指向某个节点的所有其他节点的集合。

逆邻接表的构建比较简单,只需要将邻接表反向,即将有向图的每个结点的所有入边指向相应的出边即可。

逆邻接表同样有着广泛的应用,例如:1. 求解强连通分量:通过遍历逆邻接表,可以求解图中的所有强连通分量;2. 拓扑排序:通过逆邻接表和入度数组,即可实现基于反向边的拓扑排序算法;3. 最短路径算法优化:当搜索从终点到起点时,通过使用逆邻接表,可以加速搜索过程。

总的来说,邻接表和逆邻接表是在图论中应用非常广泛的两种数据结构。

我们可以运用它们构建和优化各种算法,从而提高程序效率。

因此,熟练掌握邻接表和逆邻接表的概念、构建方法和应用场景是每一个程序员必备的技能。

数据结构_第六章_图_练习题与答案详细解析(精华版)

数据结构_第六章_图_练习题与答案详细解析(精华版)

图1. 填空题⑴ 设无向图G中顶点数为n,则图G至少有()条边,至多有()条边;若G为有向图,则至少有()条边,至多有()条边。

【解答】0,n(n-1)/2,0,n(n-1)【分析】图的顶点集合是有穷非空的,而边集可以是空集;边数达到最多的图称为完全图,在完全图中,任意两个顶点之间都存在边。

⑵ 任何连通图的连通分量只有一个,即是()。

【解答】其自身⑶ 图的存储结构主要有两种,分别是()和()。

【解答】邻接矩阵,邻接表【分析】这是最常用的两种存储结构,此外,还有十字链表、邻接多重表、边集数组等。

⑷ 已知无向图G的顶点数为n,边数为e,其邻接表表示的空间复杂度为()。

【解答】O(n+e)【分析】在无向图的邻接表中,顶点表有n个结点,边表有2e个结点,共有n+2e个结点,其空间复杂度为O(n+2e)=O(n+e)。

⑸ 已知一个有向图的邻接矩阵表示,计算第j个顶点的入度的方法是()。

【解答】求第j列的所有元素之和⑹ 有向图G用邻接矩阵A[n][n]存储,其第i行的所有元素之和等于顶点i的()。

【解答】出度⑺ 图的深度优先遍历类似于树的()遍历,它所用到的数据结构是();图的广度优先遍历类似于树的()遍历,它所用到的数据结构是()。

【解答】前序,栈,层序,队列⑻ 对于含有n个顶点e条边的连通图,利用Prim算法求最小生成树的时间复杂度为(),利用Kruskal 算法求最小生成树的时间复杂度为()。

【解答】O(n2),O(elog2e)【分析】Prim算法采用邻接矩阵做存储结构,适合于求稠密图的最小生成树;Kruskal算法采用边集数组做存储结构,适合于求稀疏图的最小生成树。

⑼ 如果一个有向图不存在(),则该图的全部顶点可以排列成一个拓扑序列。

【解答】回路⑽ 在一个有向图中,若存在弧、、,则在其拓扑序列中,顶点vi, vj, vk的相对次序为()。

【解答】vi, vj, vk【分析】对由顶点vi, vj, vk组成的图进行拓扑排序。

带答案的数据结构补充习题

带答案的数据结构补充习题

补充习题第一章——第五章一、单选或填空题1. 下列程序段中S语句的执行频度为n(n-1)/2 。

for(i=0;i<n;i++ )for(j=0;j<i;j++ )S;2. 下列算法的时间复杂度是(O(n))。

for(i=0;i<n;i++ )c[i]=i;3. 算法的时间复杂度可表示为常数阶O(1)、线性阶O(n) 、平方阶O(n2)、对数阶O(logn)和指数阶O(2n)等。

4 以下关于数据结构的基本概念中,叙述正确的是CA) 数据元素是数据不可分割的最小单位。

B) 数据是数据对象的子集。

C) 数据元素之间的关系在计算机中可用顺序映像和非顺序映像两种不同的方法表示。

D) 数据结构在计算机中的表示又称为逻辑结构。

5. 在数据结构中,数据的逻辑结构包括(A)。

线性结构和非线性结构B) 逻辑结构和物理结构顺序结构和链式结构D) 虚拟结构和抽象结构6. 在数据结构中,数据的存储结构包括 C 。

线性结构和非线性结构B) 逻辑结构和物理结构C) 顺序结构和链式结构D) 虚拟结构和抽象结构7. 线性结构的数据元素之间存在一种( D )。

A.一对多关系B.多对多关系C.多对一关系D.一对一关系8. 在长度为n的顺序表中插入一个元素,需要平均移动A个元素。

A) n/2 B)nC) n(n-1) D) n(n+1)9. 在有n个元素的顺序表中做插入、删除运算,平均时间复杂度为O(n)。

10. 顺序表中逻辑上相邻的元素物理位置B 相邻,单链表中逻辑上相邻的元素的物理位置相邻。

A)必然、必然B)必然、不一定C)不一定、必然D)不一定、不一定11.相对于顺序存储而言,链式存储的优点是(C)。

A.随机存取B.节约空间C.增、删操作方便D.节点间关系简单12 以下关于头结点的描述中,叙述错误..的是AA) 头结点是对链表首元结点的别称B) 若链表中附设头结点,则头指针一定不为空C) 头结点中不存储链表的数据元素,而是一些诸如表长之类的辅助信息D) 在单链表中附设头结点,插入或删除首元素时不必进行特殊处理13.已知L是无表头结点的单链表,且P所指结点既不是首元结点,也不是尾元结点,则在P之后插入S所指结点,则执行(A)。

中国农业大学_821数据结构_《数据结构》习题(7)

中国农业大学_821数据结构_《数据结构》习题(7)

第7章图及应用一、问答题1. 在一个图中,所有顶点的度数之和等于所有边数的多少倍?2. 在一个有向图中,所有顶点的入度之和等于所有顶点的出度之和的多少倍?3. 对图7-1(a)和(b)所示的有向图,试回答:(1) 每个顶点的入度和出度是多少;(2) 给出它们的邻接矩阵、邻接表、逆邻接表和十字链表表示。

图7-1 有向图4. 对图7-2所示的无向图,试回答:(1) 给出邻接矩阵和邻接表的表示;(2) 根据邻接表,给出从顶点v1作深度优先和广度优先遍历图中顶点的次序。

图7-2 无向图5. 对图7-3(a)和(b)所示的无向图,画出其深度优先生成树和广度优先生成树。

图7-3 无向图6. 对图7-4所示的带权无向图:(1) 按照普里姆算法,从顶点v1出发生成最小生成树,按生成次序写出各条边;(2) 按照克鲁斯卡尔算法,生成最小生成树,按生成次序写出各条边;(3) 画出其最小生成树,并求出它的权值。

图7-4 带权无向图7. 对图7-5所示的带权有向图,用迪杰斯特拉(Dijkstra)算法,试回答:(1) 带权邻接矩阵arcs是什么?(2) 从顶点v1到其他各顶点之间的最短路径是多少?并写出Dist数组的变化过程。

图7-5 带权有向图8. 对图7-6所示的带权有向图,用弗洛伊德(Floyd)算法,试回答:每一对顶点之间的最短路径试多少,并写出计算过程。

图7-6 带权有向图9. 已知有m个顶点的无向图,采用邻接矩阵结构存储,试回答:(1) 图中有多少边?(2) 任意两个顶点i和j之间是否有边相连?(3) 任意一个顶点的度是多少?10. 已知一个无向图,采用邻接表结构存储,试回答:(1) 图中有多少边,(2) 任意两个顶点i和j之间是否有边相连?(3) 任意一个顶点的度是多少?11. 对图7-7所示的AOE网所代表的一项计划,试回答:(1) 每一事件的最早开始时间和最迟开始时间是多少?(2) 该计划最早完成的时间是多少?图7-7 代表一项计划的AOE网12. 对图7-8所示的AOE网所代表的一项工程,试回答:(1) 每项活动的最早开始时间是多少?(2) 每项活动的最迟开始时间是多少?(3) 工程完成的最短时间是多少?(4) 关键活动是什么?图7-8 代表一项工程的AOE网二、填空题1. 在无权图G的邻接矩阵A中,若(i, j)或<i, j>属于图G的边集合,则对应元素A [i, j]等于、否则等于。

计算机专业基础综合数据结构图历年真题试卷汇编7_真题无答案

计算机专业基础综合数据结构图历年真题试卷汇编7_真题无答案

计算机专业基础综合数据结构(图)历年真题试卷汇编7(总分62, 做题时间90分钟)7. 设计题1.已知连通图如下:(1)若从顶点B出发对该图进行遍历,在(1)的基础上分别给出本图的按深度优先搜索和按广度优先搜索的顶点序列;(2)写出按深度优先搜索的递归程序。

【厦门大学200l三(12%分)】SSS_TEXT_QUSTI2.设计算法以实现对无向图G的深度遍历,要求:将每一个连通分量中的顶点以一个表的形,式输出。

例如,下图的输出结果为:(1,3)(2,6,7,4,5,8)(9,10)。

注:本算法中可以调用以下几个函数:firstadj(g,1,)——返回图g中顶点v的第一个邻接点的号码,若不存在,则返回0。

nextadj(g,v,w)——返回图g中顶点v的邻接点中处于w之后的邻接点的号码,若不存在,则返回0。

nodes(g)——返回图g中的顶点数。

【合肥工业大学2000五、4(8分)】SSS_TEXT_QUSTI3.请设计一个图的抽象数据类型(只需要用类Pascal或类C/C++语言给出其主要功能函数或过程的接口说明,不需要指定存储结构,也不需要写出函数或过程的实现方法),利用抽象数据类型所提供的函数或过程编写图的广度优先周游算法。

算法不应该涉及具体的存储结构,也不允许不通过函数或过程而直接引用图结构的数据成员,抽象数据类型和算法都应该加足够的注释。

【北京大学1999二、1(10分)】SSS_TEXT_QUSTI4.设计算法以判断给定的无向图G中是否存在一条以网为起点的包含所有顶点的简单路径,若存在,返回TRUE,否则,返回FALSE(注:本算法中可以调用以下几个函数:FIRSTADJ(G,V)——返回图G中顶点V的第一个邻接点的号码,若不存在,则返回0;NEXTADJ(G,W)——返回图G中顶点V的邻接点中处于W之后的邻接点的号码,若不存在,则返回0;NODES(G)——返回图G中的顶点数)。

【合肥工业大学1999五、5(8分)】SSS_TEXT_QUSTI5.已有邻接表表示的有向图,请编程判断从第u顶点至第v顶点是否有简单路径,若有,则印出该路径上的顶点。

数据结构第7章习题答案

数据结构第7章习题答案

第7章 《图》习题参考答案一、单选题(每题1分,共16分)( C )1. 在一个图中,所有顶点的度数之和等于图的边数的倍。

A .1/2 B. 1 C. 2 D. 4 (B )2. 在一个有向图中,所有顶点的入度之和等于所有顶点的出度之和的倍。

A .1/2 B. 1 C. 2 D. 4 ( B )3. 有8个结点的无向图最多有条边。

A .14 B. 28 C. 56 D. 112 ( C )4. 有8个结点的无向连通图最少有条边。

A .5 B. 6 C. 7 D. 8 ( C )5. 有8个结点的有向完全图有条边。

A .14 B. 28 C. 56 D. 112 (B )6. 用邻接表表示图进行广度优先遍历时,通常是采用来实现算法的。

A .栈 B. 队列 C. 树 D. 图 ( A )7. 用邻接表表示图进行深度优先遍历时,通常是采用来实现算法的。

A .栈 B. 队列 C. 树 D. 图( C )8. 已知图的邻接矩阵,根据算法思想,则从顶点0出发按深度优先遍历的结点序列是( D )9. 已知图的邻接矩阵同上题8,根据算法,则从顶点0出发,按深度优先遍历的结点序列是A . 0 2 4 3 1 5 6 B. 0 1 3 5 6 4 2 C. 0 4 2 3 1 6 5 D. 0 1 23465 ( D )10. 已知图的邻接表如下所示,根据算法,则从顶点0出发按深度优先遍历的结点序列是( A )11. 已知图的邻接表如下所示,根据算法,则从顶点0出发按广度优先遍历的结点序列是A .0 2 4 3 1 5 6B. 0 1 3 6 5 4 2C. 0 1 3 4 2 5 6D. 0 3 6 1 5 4 2⎥⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡0100011101100001011010110011001000110010011011110A .0 1 3 2 B. 0 2 3 1 C. 0 3 2 1 D. 0 1 2 3A.0 3 2 1 B. 0 1 2 3C. 0 1 3 2D. 0 3 1 2(A)12. 深度优先遍历类似于二叉树的A.先序遍历 B. 中序遍历 C. 后序遍历 D. 层次遍历(D)13. 广度优先遍历类似于二叉树的A.先序遍历 B. 中序遍历 C. 后序遍历 D. 层次遍历(A)14. 任何一个无向连通图的最小生成树A.只有一棵 B. 一棵或多棵 C. 一定有多棵 D. 可能不存在(注,生成树不唯一,但最小生成树唯一,即边权之和或树权最小的情况唯一)二、填空题(每空1分,共20分)1. 图有邻接矩阵、邻接表等存储结构,遍历图有深度优先遍历、广度优先遍历等方法。

算法功能:采用邻接表存储结构建立无向图

算法功能:采用邻接表存储结构建立无向图
;
if(i >= G.vexnum)
return -1;
return i;
}
//构造邻接链表
Status CreateUDN(ALGraph &G)
{
int j;
ArcNode *s, *t;
printf("输入无向图顶点数: ");
scanf("%d", &G.vexnum);
printf("输入无向图边数: ");
getchar();
}
char v1, v2;
for(int k = 0; k < G.arcnum; k++)
{
printf("输入第%d条边依附的顶点v1: ", k+1);
scanf("%c", &v1);
getchar();
printf("输入第%d条边依附的顶点v2: ", k+1);
scanf("%c", &v2);
s->adjvex = j; //该边所指向的顶点的位置为j
s->nextarc = G.vertices[i].firstarc;
G.vertices[i].firstarc =s;
t->adjvex = i; //该边所指向的顶点的位置为j
t->nextarc = G.vertices[j].firstarc;
G.vertices[j].firstarc =t;}Βιβλιοθήκη return OK;}
Status PrintAdjList(ALGraph &G)
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档