数据结构设计无向图

数据结构课程设计——无向图学校专业班级姓名学号任课教师题目3:以邻接链表的方式确定一个无向网,完成:⑴建立并显示出它的邻接矩阵;⑵对该图进行广度优先遍历,显示遍历的结果,(并随时显示队列的入、出情况);⑶普里姆算法构造其最小生成树,随时显示其构造的过程;⑷用克鲁斯卡尔算法构造其最小生成树,随时显示其构造的过程。

一、需求分析1.运行环境:Microsoft Visual Studio 20122.程序所实现的功能:a)建立并显示图的邻接矩阵;b)广度优先遍历该图,显示遍历结果;c)用普里姆算法构造该图的最小生成树,显示构造过程;d)用克鲁斯卡尔算法构造该图的最小生成树,显示构造过程。

3.程序的输入,包含输入的数据格式和说明:a)输入顶点数,及各顶点信息(数据格式为整形);b)输入弧以及其权值(数据格式为整形)。

1.程序的输出,程序输出的形式:a)输出图的邻接矩阵;b)广度优先遍历结果;c)普里姆算法构造最小生成树的结果;d)克鲁斯卡尔算法构造最小生成树的结果。

2.测试数据,如果输入的数据量较大,需要给出测试数据:a)顶点个数:5b)各个顶点为:A B C D Ec)输入所有的弧(格式为“顶点顶点权值”)为:A B 10 A C 4 B D 3 C D 5 B E 6 D E 9二、设计说明算法设计的思想:建立图类,建立相关成员函数。

最后在主函数中实现。

具体成员函数的实现请参看源程序。

在本次的设计中,我采用的是多文件的编程方式。

每个类写成了一个头文件。

这样有助于阅读和查看源程序。

1.邻接链表:邻接链表是一种链式存储结构。

在邻接链表中,对图中每个顶点建立一个单链表,第i个单链表中的结点表示依附于顶点Vi的边(对有向图是以顶点Vi为尾的弧)。

每个结点由3个域组成,其中邻接点域指示与顶点Vi邻接的点在图中的位置,链域指示下一条边或弧的结点;数据域存储和边或弧相关的信息,如权值等。

所以一开始必须先定义邻接链表的边结点类型以及邻接链表类型,并对邻接链表进行初始化,然后根据所输入的相关信息,包括图的顶点数、边数、是否为有向,以及各条边的起点与终点序号,建立图的邻接链表。

2.邻接矩阵:图的邻接矩阵存储表示即是数组存储表示,在邻接矩阵中,我们定义两个数组分别存储数据元素的信息和数据元素之间的关系(边或弧)的信息,以二维数组表示有n个顶点的图时,需存放n个顶点信息和n的平方个弧信息的存储量。

借助于邻接矩阵容易判定任意两个顶点之间是否有边或弧相连,并容易求得各个顶点的度。

故在建立邻接矩阵之前,必须先定义顶点关系类型和相关指针指示弧的信息。

3.广度优先遍历:假设从图总某顶点出发,在访问了v之后依次访问v的各个未曾访问到的邻接点,然后分别从这些邻接点出发依次访问它们的邻接点,并使“先被访问的邻接点”先于“后被访问的邻接点”被访问,直至图中所有已被访问的邻接点都被访问到。

若此时图中尚有顶点未被访问到,则另选图中一个未曾被访问的顶点作为起始点,重复上述过程,直至图中所有顶点都被访问到为止。

换句话说,广度优先搜索遍历图的过程是以v为起始点,由近及远,依次访问饿v有路径相通且路径长度为1,2….的顶点。

和深度优先搜索类似,在遍历过程中也需要一个访问标志数组。

并且,为了顺次访问路径长度为2,3…的顶点,需附设队列以存储已被访问的路径长度为1,2….的顶点。

所以要实现算法必须先建立一个元素类型为整形的空队列,并定义队首与队尾指针,同时也要定义一个标志数组以标记结点是否被访问。

同样,也是从初始点出发开始访问,访问初始点,标志其已被访问,并将其入队。

当队列非空时进行循环处理。

当结点被访问时对其进行标志,并入队列。

通过while()循环,并以是否被访问为控制条件,访问所有结点,完成图的广度优先遍历。

4.普里姆算法:假设N=(V,{E})是连通网,TE是N上最小生成数中边的集合。

算法从U={U0},TE={}开始,重复执行如下操作;在所有的边(u,v)中找一条代价最小的边(u0,v0)并入集合TE,同时V0并入U,直到U=V为止。

此时TE中必有n-1条边,则,T=(V,{TE})为N 的最小生成树。

5.克鲁斯卡尔算法:假设连通网N=(V,{E}),则令最小生成树的初始状态为只有n个顶点且无边的非连通图T=(V,{}),图中每个顶点自成一个连通分量。

在E 中选择代价最小的边,若该边依附的顶点落在T中不同的连通分量上,则将此边加入到T中,否则舍去此边而选择下一条代价最小的边。

依次类推,直到T中的所有顶点都在同一个连通分量上为止。

主要的数据结构设计说明:图的邻接矩阵、邻接表的建立。

图的广度优先遍历以及分别用普里姆算法和克鲁斯卡尔算法构造最小生成树。

程序的主要流程图:程序的主要模块,要求对主要流程图中出现的模块进行说明:用邻接链表的方式确定一个无向图,以邻接矩阵的方式输出,再进行图的广度优先遍历以及分别用普里姆算法和克鲁斯卡尔算法构造最小生成树并输出。

程序的主要函数说明:int locatepoint( string );定位节点位置无向网邻接表方式确定输出邻接矩阵普里姆算法克鲁斯卡尔算法广度优先遍历void Breadth_traversal();广度优先遍历void printgragh();邻接矩阵的输出void prim();普里姆算法void ktus();克鲁斯卡尔算法三、上机结果及体会1.上机过程中出现的问题及其解决方案。

问题:刚开始编译没有错误,但结果有问题。

在其中的普里姆算法和克鲁斯卡尔算法的循环过程中,对循环控制变量设置不当,导致程序陷入死循环之中。

解决方案:调整改变循环控制变量。

2.程序中可以改进的地方说明✧程序中的广度优先遍历,可以考虑用循环来做,也可以用栈来实现。

✧在本程序中,两个没有联系的顶点之间的权值的无穷大我是用“0”来表示的。

可以考虑用一个特殊字符来实现。

四、实验源程序*******************************************************************************头文件node_linklist.h#ifndef NODE_LINKLIST#define NODE_LINKLISTclass node_array;//邻接链表链结点class node_linklist{public:int position;int weight;node_linklist*next;node_linklist(int a,int b){position=a;weight=b;next=NULL;}node_linklist(){position=NULL;weight=NULL;next=NULL;}~node_linklist(){}};#endif*******************************************************************************头文件node_array.h#ifndef NODE_ARRAY#define NODE_ARRAY//邻接链表数组结点class node_array{public:node_linklist*next;string data;node_array(){data='\0';next=NULL;}~node_array(){}};#endif*******************************************************************************头文件tu_matrix.h#ifndef TU_MATRIX#define TU_MATRIX//图类class tu_matrix{private:int matrix[MAX][MAX];string toppoint[MAX];int numpoint;node_array vertices[MAX];public:tu_matrix(){}void creat();int locatepoint(string);//返回这个顶点的位置void Breadth_traversal();void printgragh();void prim();void ktus();};int tu_matrix::locatepoint(string b){int i=0;for(;i<numpoint;i++){if(toppoint[i]==b)return i;}return-1;}void tu_matrix::creat(){string data,data1,data2;int n,m,num;//输入顶点个数cout<<"请输入您要创建的无向图的顶点个数:"<<'\t';cin>>numpoint;//输入顶点cout<<"请依次输入该无向图的各个顶点:"<<endl;for(int i=0;i<numpoint;i++){cin>>toppoint[i];}//以邻接链表确定无向网node_linklist*(*end)=new node_linklist*[numpoint];//指向数组链表的最后一个节点指针数组int*pp=new int[numpoint];//辅助数组,当其中的值不为0时,表示该数组节点后面已经有至少一个链表节点,否则表示没有链表节点for(int i=0;i<numpoint;i++)pp[i]=0;node_linklist*ppp=NULL;cout<<"输入该无向图所有的弧,格式为:“顶点顶点权值”,输入“0 0 0”结束"<<endl;do{cin>>data1>>data2>>num;n=locatepoint(data1);m=locatepoint(data2);if((n!=-1)&&(m!=-1)){if(!pp[n])//如果该数组节点后面没有链表节点{ppp=new node_linklist(m,num);end[n]=vertices[n].next=ppp;pp[n]=1;}else{end[n]->next=new node_linklist(m,num);end[n]=end[n]->next;}if(!pp[m])//如果该数组节点后面没有链表节点{ppp=new node_linklist(n,num);end[m]=vertices[m].next=ppp;pp[m]=1;}else{end[m]->next=new node_linklist(n,num);end[m]=end[m]->next;}}}while((data1!="0")&&(data2!="0")&&(num!=0));//根据邻接链表建立邻接矩阵node_linklist*p;for(int i=0;i<numpoint;i++)//初始化for(int j=0;j<numpoint;j++)matrix[i][j]=0;for(int i=0;i<numpoint;i++){p=vertices[i].next;while(p){n=p->position;m=p->weight;p=p->next;matrix[i][n]=m;};}delete end;}void tu_matrix::printgragh()//打印无向网的邻接矩阵{cout<<"该图的邻接矩阵为:"<<"\n--------------------------------------------------------------------------------"<<endl;int i,j;for(i=0;i<numpoint;i++){for(j=0;j<numpoint;j++){cout<<matrix[i][j]<<'\t';}cout<<endl;}cout<<"--------------------------------------------------------------------------------"<<endl;}void tu_matrix::Breadth_traversal(){int*flag=new int[numpoint];//记录顶点访问状态int*queue=new int[numpoint+1];//记录未广度遍历的顶点数int front,rear;front=rear=0;int i;cout<<"该图的广度优先遍历为:"<<"\n--------------------------------------------------------------------------------"<<endl;for(i=0;i<numpoint;i++)flag[i]=0;//状态初始化do{for(i=0;i<numpoint;i++)if(flag[i]==0)break;if(i!=numpoint){cout<<"---->\t"<<toppoint[i]<<endl;rear=(rear+1)%(numpoint+1);queue[rear]=i;cout<<"入队列\t"<<toppoint[i]<<endl;flag[i]=1;do{front=(front+1)%(numpoint+1);cout<<"出队列\t"<<toppoint[queue[front]]<<endl;for(int j=0;j<numpoint;j++){if((matrix[queue[front]][j]!=0)&&(flag[j]!=1)){cout<<"---->\t"<<toppoint[j]<<endl;rear=(rear+1)%(numpoint+1);queue[rear]=j;cout<<"入队列\t"<<toppoint[j]<<endl;flag[j]=1;}}}while(((rear+1)%(numpoint+1)!=front)&&(rear!=front));//队列结束条件,队列满或空}}while(i!=numpoint);cout<<"--------------------------------------------------------------------------------"<<endl;}void tu_matrix::prim(){int flag[MAX],point[MAX],n,m,x,p=0;//flag[]标志结点所属树,p表示已访问过的结点个数int matrixone[MAX][MAX];//辅助矩阵for(int i=0;i<numpoint;i++)for(int j=0;j<numpoint;j++)matrixone[i][j]=matrix[i][j];for(int i=0;i<numpoint;i++)flag[i]=0;//标志位初始化cout<<"用普里姆算法构造的最小生成树为:"<<"\n--------------------------------------------------------------------------------"<<endl;//先找到最小的一个弧x=m=n=0;for(int i=0;i<numpoint;i++){for(int j=i;j<numpoint;j++)if(matrixone[i][j]!=0){x=matrixone[i][j];break;}if(x!=0)break;}//预先给x一个没有被访问过的,且不是0的权值for(int i=0;i<numpoint;i++)for(int j=i;j<numpoint;j++){if((matrixone[i][j]!=0)&&(matrixone[i][j]<=x)){x=matrixone[i][j];m=i;n=j;}}p+=2;point[0]=m;point[1]=n;flag[m]=flag[n]=1;cout<<toppoint[m]<<"\t与顶点\t"<<toppoint[n]<<"\t相连\t权值为\t"<<x<<endl;while(p<numpoint){x=m=n=0;for(int i=0;i<numpoint;i++){for(int j=i;j<numpoint;j++)if(matrixone[i][j]!=0&&((flag[i]==0&&flag[j]!=0)||(flag[i]!=0&& flag[j]==0))){x=matrixone[i][j];break;}if(x!=0)break;}//预先给x一个没有被访问过的,且不是0的权值for(int i=0;i<p;i++){for(int j=0;j<numpoint;j++){if((matrixone[j][point[i]]!=0)&&matrixone[j][point[i]]<=x&&flag[j]==0){x=matrixone[j][point[i]];n=point[i];m=j;}}}if(m!=n&&x!=0){point[p]=m;p++;cout<<toppoint[n]<<"\t与顶点\t"<<toppoint[m]<<"\t相连\t权值为\t"<<x<<endl;flag[m]=1;}}cout<<"--------------------------------------------------------------------------------"<<endl;}void tu_matrix::ktus(){int flag[MAX],n,m,x,p,k;//flag[]标志结点所属树,p表示已访问弧个数int matrixtow[MAX][MAX];//辅助矩阵for(int i=0;i<numpoint;i++)for(int j=0;j<numpoint;j++)matrixtow[i][j]=matrix[i][j];cout<<"用克鲁斯卡尔算法构造的最小生成树为:"<<"\n--------------------------------------------------------------------------------"<<endl;for(int i=0;i<MAX;i++)flag[i]=0;//初始化k=p=0;while(p<(numpoint-1)){x=n=m=0;for(int i=0;i<numpoint;i++)for(int j=i;j<numpoint;j++)if(matrixtow[i][j]!=0)x=matrixtow[i][j];//预先给x一个没有被访问过的,且不是0的权值for(int i=0;i<numpoint;i++)for(int j=0;j<numpoint;j++){if((matrixtow[i][j]!=0)&&(matrixtow[i][j]<=x)){x=matrixtow[i][j];m=i;n=j;}}if(x!=0&&m!=n){if(flag[n]!=0)if(flag[m]!=0)if(flag[n]==flag[m])//避免成环情况{continue;}else{cout<<toppoint[n]<<"\t与顶点\t"<<toppoint[m]<<"\t相连\t权值为\t"<<x<<endl;p++;flag[numpoint]=flag[m];for(int h=0;h<numpoint;h++)if(flag[h]==flag[numpoint])flag[h]=flag[n];}else{cout<<toppoint[n]<<"\t与顶点\t"<<toppoint[m]<<"\t相连\t权值为\t"<<x<<endl;flag[m]=flag[n];p++;}//后结点为新elseif(flag[m]!=0){cout<<toppoint[n]<<"\t与顶点\t"<<toppoint[m]<<"\t相连\t权值为\t"<<x<<endl;flag[n]=flag[m];p++;}else{cout<<toppoint[n]<<"\t与顶点\t"<<toppoint[m]<<"\t相连\t权值为\t"<<x<<endl;flag[n]=flag[m]=k;p++;}matrixtow[m][n]=matrixtow[n][m]=0;}k++;};cout<<"--------------------------------------------------------------------------------"<<endl;}#endif*******************************************************************************源文件main.cpp#include<iostream>#include<string>#define MAX40using namespace std;#include"node_linklist.h"#include"node_array.h"#include"tu_matrix.h"void main(){int k=1;tu_matrix*graph;while(k){cout<<"===================================================================="<<e ndl;graph=new tu_matrix();graph->creat();graph->printgragh();graph->Breadth_traversal();graph->ktus();graph->prim();delete graph;cout<<"===================================================================="<<e ndl;cout<<"\n如果您想继续建立另一个无向图,请输入‘1’;如果您想退出程序,请输入‘0’"<<"\n"<<endl;cin>>k;}system("pause");}五、输出结果显示六、收获及体会在这次的上机实验中,我更深入地学习了图的相关算法思想及其实现过程,用C++语言实现了算法。

合集下载

迪杰斯特拉算法和Floyd算法实现无向图的最短路径的计算和求解

迪杰斯特拉算法和Floyd算法实现无向图的最短路径的计算和求解

摘要本次课程设计主要核心为利用迪杰斯特拉算法和Floyd算法实现无向图的最短路径的计算和求解。

要求理解算法的具体实现流程、学会正确使用该算法求解实际问题。

本次课程设计具体内容是:通过对两个算法的理解与应用来比较两个算法的优缺点。

本程序要求结合最短路算法以及相应的数据结构的定义和使用,实现一个最短路径算法的简单应用。

本课程设计是对书本知识的简单应用,以此培养大家用书本知识解决实际问题的能力;培养实际工作所需要的动手能力;培养以科学理论和工程上能力的技术,规范地开发大型、复杂、高质量的应用软件和系统软件。

关键字:迪杰斯特拉算法,Floyd算法,最短路径,算法设计,数据结构目录摘要 --------------------------------------------------------------- 1一、Dijkstra算法--------------------------------------------------- 31.1定义概览 ---------------------------------------------------- 31.2算法描述 ---------------------------------------------------- 31.2.1算法思想:--------------------------------------------- 31.1.2算法步骤----------------------------------------------- 31.3算法代码实现 ------------------------------------------------ 41.4算法实例 ---------------------------------------------------- 5二、Floyd算法------------------------------------------------------ 72.1定义概览 ---------------------------------------------------- 72.2算法描述 ---------------------------------------------------- 72.2.1算法思想原理------------------------------------------- 72.3算法代码实现 ----------------------------------------------- 10三、结论 ---------------------------------------------------------- 11四、参考文献 ------------------------------------------------------ 12一、Dijkstra算法1.1定义概览Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径。

数据结构(Java版)图2(最小生成树)

数据结构(Java版)图2(最小生成树)

最小生成树举例
A
50 60 52 65 50
C
45 42 30 50
A
C
45
B
40
D
G
B
40 50
D
42 30
G
E
70
F
E
F
(a) 无向带权连通图G
(b) 无向带权图G 的最小生成树T
从最小生成树的定义可知,构造n个顶点的无向带权连 通图的最小生成树,必须满足如下三个条件: ① 必须包含n个顶点。 ② 有且仅有n-1条边。 ③ 没有回路。

将ej边加入到tree中;
}
实践项目

设计一个程序实现Prim和Kruskal算法.
表5-1 lowcost[ ]数组数据变化情况 表5-2 closest[ ]数组数据变化情况
扫描次数
closest[0]
closest[1]
closest[2]
closest[3]
closest[4]
closest[5]
求最小生成树算法

普里姆算法(Prim) (从点着手)

适合于求边稠密的最小生成树 适合于求边稀疏的最小生成树

克鲁斯卡尔算法(Kruskal)(从边着手)

普里姆算法(Prim)思想
1.
2.
3.
4.
令集合U={u0}(即从顶点u0开始构造最小生 成树),集合T={}。 从所有顶点u∈U和顶点v∈V-U的边权中选择最 小权值的边(u,v),将顶点v加入到集合U中,边 (u,v)加入到集合T中。 如此重复下去,直到U=V时则最小生成树构造完 毕。 此时集合U就是最小生成树的顶点集合,集合T 就是最小生成树的边集。

离散数学 7-1图概念7-2路与回路

离散数学 7-1图概念7-2路与回路
若一条路中所有的边e1, …, en均不相同,称作迹 。 若一条路中所有的结点v0, v1,…, vn均不相同,称作通路 。 闭的通路,即除v0=vn之外,其余结点均不相同的路,称作圈。
例如
路:v1e2v3e3v2e3v3e4v2e6v5e7v3 迹:v5e8v4e5v2e6v5e7v3e4v2 通路:v4e8v5e6v2e1v1e2v3
学习本节要熟悉如下术语(22个): 路、 路的长度、 回路、 迹、 通路、 圈、 割点、
连通、连通分支、 连通图、 点连通度、
点割集、
边割集、 割边、 边连通度、 可达、 弱分图、
单侧连通、 强连通、 弱连通、 强分图、 单侧分图 掌握5个定理,一个推论。
7-2 路与回路



无向图的连通性
7-1 图的基本概念


图的定义
点的度数
特殊的图 图同构
三、特殊的图
1、多重图 定义7-1.4:含有平行边的图称为多重图。 2、简单图:不含平行边和环的图称为简单图。 3、完全图 定义7-1.5:简单图G=<V,E>中,若每一对结点 间均有边相连,则称该图为完全图。 有n个结点的无向完全图记为Kn。 无向完全图:每一条边都是无向边 不含有平行边和环 每一对结点间都有边相连
3、图的分类:
①无向图:每条边均为无向边的图称为无向图。 ②有向图:每条边均为有向边的图称为有向图。
③混合图:有些边是无向边,有些边是有向边的图称
为混合图。
v1 (孤立点) v5 V1’ v1 环
v2
v4 v3 (a)无向图
V2’
V3’ (b)有向图 V4’
v2
v4 v3 ( c ) 混合图
4、点和边的关联:如ei=(u,v)或ei=<u,v>称u, v与ei关联。 5、点与点的相邻:关联于同一条边的结点称为邻 接点。

图习题-数据结构

图习题-数据结构

习题七图一、单项选择题1.设有无向图G=(V,E)和G’=(V’,E’),如G’为G的生成树,则下面不正确的说法是()A.G’为G的子图 B.G’为G的连通分量C.G’为G的极小连通子图且V’=V D.G’是G的无环子图2.任何一个带权的无向连通图的最小生成树()A.只有一棵 B.有一棵或多棵 C.一定有多棵 D.可能不存在3.以下说法正确的是()A.连通分量是无向图中的极小连通子图。

B.强连通分量是有向图中的极大强连通子图。

C.在一个有向图的拓扑序列中,若顶点a在顶点b之前,则图中必有一条弧<a,b>。

D.对有向图G,如果从任意顶点出发进行一次深度优先或广度优先搜索能访问到每个顶点,则该图一定是完全图。

4.图中有关路径的定义是()。

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

A.n-1 B.n(n-1)/2 C. n(n+1)/2 D.0 E.n26.要连通具有n个顶点的有向图,至少需要()条边。

A.n-l B.n C.n+l D.2n7.在一个无向图中,所有顶点的度数之和等于所有边数()倍,在一个有向图中,所有顶点的入度之和等于所有顶点出度之和的()倍。

A.1/2 B.2 C.1 D.48.下列哪一种图的邻接矩阵是对称矩阵?()A.有向图 B.无向图 C.AOV网 D.AOE网9. 下列说法不正确的是()。

A.图的遍历是从给定的源点出发每一个顶点仅被访问一次B.遍历的基本算法有两种:深度遍历和广度遍历C.图的深度遍历不适用于有向图D.图的深度遍历是一个递归过程10.下面哪一方法可以判断出一个有向图是否有环(回路):A.深度优先遍历 B. 拓扑排序 C. 求最短路径 D. 求关键路径11. 在图采用邻接表存储时,求最小生成树的 Prim 算法的时间复杂度为( )。

国开作业《数据结构(本)-形考作业》 (20)

国开作业《数据结构(本)-形考作业》 (20)

题目:如果从无向图的任一顶点出发进行一次深度优先搜索即可访问所有顶点,则该图一定是()。

选项A:一棵树选项B:有回路选项C:连通图选项D:完全图答案:连通图题目:下列有关图遍历的说法不正确的是()。

选项A:非连通图不能用深度优先搜索法选项B:图的遍历要求每一顶点仅被访问一次选项C:连通图的深度优先搜索是一个递归过程选项D:图的广度优先搜索中邻接点的寻找具有“先进先出”的特征答案:非连通图不能用深度优先搜索法题目:无向图的邻接矩阵是一个()。

选项A:对称矩阵选项B:对角矩阵选项C:上三角矩阵选项D:零矩阵答案:对称矩阵题目:图的深度优先遍历算法类似于二叉树的()遍历。

选项A:后序选项B:先序选项C:层次选项D:中序答案:先序题目:已知下图所示的一个图,若从顶点V1出发,按深度优先搜索法进行遍历,则可能得到的一种顶点序列为()。

/pluginfile.php/67710/question/questiontext/2988635/7/108770/01 .png选项A:V1V2V4V8V3V5V6V7选项B:V1V2V4V8V5V3V6V7选项C:V1V2V4V5V8V3V6V7选项D:V1V3V6V7V2V4V5V8答案:V1V2V4V8V5V3V6V7题目:在一个图G中,所有顶点的度数之和等于所有边数之和的()倍。

选项A:1选项B:1/2选项C:4选项D:2答案:2题目:邻接表是图的一种()。

选项A:顺序存储结构选项B:索引存储结构选项C:散列存储结构选项D:链式存储结构答案:链式存储结构题目:已知如图2所示的一个图,若从顶点a出发,按广度优先搜索法进行遍历,则可能得到的一种顶点序列为()。

/pluginfile.php/67710/question/questiontext/2988635/8/108771/02 .png选项A:aebcfd选项B:abcefd选项C:acfdeb选项D:abcedf答案:abcefd题目:已知如图3所示的一个图,若从顶点a出发,按深度优先搜索法进行遍历,则可能得到的一种顶点序列为()。

数据结构试题及答案(免费)

数据结构试题及答案(免费)

数据结构试卷(十一)一、选择题(30分)1.设某无向图有n个顶点,则该无向图的邻接表中有()个表头结点。

(A) 2n (B) n (C) n/2 (D) n(n-1)2.设无向图G中有n个顶点,则该无向图的最小生成树上有()条边。

(A) n (B) n-1 (C) 2n (D) 2n-13.设一组初始记录关键字序列为(60,80,55,40,42,85),则以第一个关键字45为基准而得到的一趟快速排序结果是()。

(A) 40,42,60,55,80,85 (B) 42,45,55,60,85,80(C) 42,40,55,60,80,85 (D) 42,40,60,85,55,804.()二叉排序树可以得到一个从小到大的有序序列。

(A) 先序遍历(B) 中序遍历(C) 后序遍历(D) 层次遍历5.设按照从上到下、从左到右的顺序从1开始对完全二叉树进行顺序编号,则编号为i结点的左孩子结点的编号为()。

(A) 2i+1 (B) 2i (C) i/2 (D) 2i-16.程序段s=i=0;do {i=i+1;s=s+i;}while(i<=n);的时间复杂度为()。

(A) O(n) (B) O(nlog2n) (C) O(n2) (D) O(n3/2)7.设带有头结点的单向循环链表的头指针变量为head,则其判空条件是()。

(A) head==0 (B) head->next==0(C) head->next==head (D) head!=08.设某棵二叉树的高度为10,则该二叉树上叶子结点最多有()。

(A) 20 (B) 256 (C) 512 (D) 10249.设一组初始记录关键字序列为(13,18,24,35,47,50,62,83,90,115,134),则利用二分法查找关键字90需要比较的关键字个数为()。

(A) 1 (B) 2 (C) 3 (D) 410.设指针变量top指向当前链式栈的栈顶,则删除栈顶元素的操作序列为()。

考研数据结构图的必背算法及知识点

考研数据结构图的必背算法及知识点Prepared on 22 November 20201.最小生成树:无向连通图的所有生成树中有一棵边的权值总和最小的生成树问题背景:假设要在n个城市之间建立通信联络网,则连通n个城市只需要n—1条线路。

这时,自然会考虑这样一个问题,如何在最节省经费的前提下建立这个通信网。

在每两个城市之间都可以设置一条线路,相应地都要付出一定的经济代价。

n个城市之间,最多可能设置n(n-1)/2条线路,那么,如何在这些可能的线路中选择n-1条,以使总的耗费最少呢分析问题(建立模型):可以用连通网来表示n个城市以及n个城市间可能设置的通信线路,其中网的顶点表示城市,边表示两城市之间的线路,赋于边的权值表示相应的代价。

对于n个顶点的连通网可以建立许多不同的生成树,每一棵生成树都可以是一个通信网。

即无向连通图的生成树不是唯一的。

连通图的一次遍历所经过的边的集合及图中所有顶点的集合就构成了该图的一棵生成树,对连通图的不同遍历,就可能得到不同的生成树。

图G5无向连通图的生成树为(a)、(b)和(c)图所示:G5G5的三棵生成树:可以证明,对于有n个顶点的无向连通图,无论其生成树的形态如何,所有生成树中都有且仅有n-1条边。

最小生成树的定义:如果无向连通图是一个网,那么,它的所有生成树中必有一棵边的权值总和最小的生成树,我们称这棵生成树为最小生成树,简称为最小生成树。

最小生成树的性质:假设N=(V,{E})是个连通网,U是顶点集合V的一个非空子集,若(u,v)是个一条具有最小权值(代价)的边,其中,则必存在一棵包含边(u,v)的最小生成树。

解决方案:两种常用的构造最小生成树的算法:普里姆(Prim)和克鲁斯卡尔(Kruskal)。

他们都利用了最小生成树的性质1.普里姆(Prim)算法:有线到点,适合边稠密。

时间复杂度O(N^2)假设G=(V,E)为连通图,其中V为网图中所有顶点的集合,E为网图中所有带权边的集合。

湖经数据结构 7-图


计算机科学与技术学院 软件工程系 邓沌华
基于邻接矩阵的图的深度优先遍历算法
typedef struct vertextype
void DFS (MGraph G,int v )
{ int no;
char data; }VertexType; typedef struct mgraph
{ int w;
4
8
5
6
7
是一个递归的过程,类似于树的先序遍历。
遍历结果:
1
2
4
8
5
3
6
7
计算机科学与技术学院 软件工程系 邓沌华
例 1: 1
深度优先遍历
答案一: 1
2 5 4 3 答案二: 6
2
4
8
5
6
3
7
7 8
1
2
5
8
4
7
3
6
答案三:
1 3 6 8 7 4 2 5
计算机科学与技术学院 软件工程系 邓沌华
例 2: 已知图的邻接表如下所示,根据算法,则从顶点0出 发按深度优先遍历的结点序列是 A. 0 1 3 2 C. 0 3 2 1 B. 0 2 3 1 D. 0 1 2 3 √
计算机科学与技术学院 软件工程系 邓沌华
引言 图是比线性表和树更为复杂的非线性的数据结构。 线性表:前后相继、序列;
树:层次、分支;
图:结点之间 的关系可以是任意的,任意两个数 据元素之间都可能相关。 线性表和树都可以看成是简单的图。 图的应用领域:电路网络分析、交通运输、管理 与线路的铺设、印刷电路板与集成电路的布线等; 工作的分配、工程进度的安排、课程表的制订、 关系数据库的设计等。

数据结构第五章图习题

05 图【单选题】1. 设无向图G 中有五个顶点,各顶点的度分别为2、4、3、1、2,则G 中边数为(C )。

A、4条 B、5条 C、6条 D、无法确定2. 含n 个顶点的无向完全图有(D )条边;含n 个顶点的有向图最多有(C )条弧;含n 个顶点的有向强连通图最多有(C )条弧;含n 个顶点的有向强连通图最少有(F)条弧;设无向图中有n 个顶点,则要接通全部顶点至少需(G )条边。

A 、n 2B 、n(n+1)C 、n(n-1)D 、n(n-1)/2E 、n+1F 、nG 、n-13. 对下图从顶点a 出发进行深度优先遍历,则(A )是可能得到的遍历序列。

A 、acfgdebB 、abcdefgC 、acdgbefD 、abefgcd对下图从顶点a 出发进行广度优先遍历,则(D )是不可能得到的遍历序列。

A 、abcdefgB 、acdbfgeC 、abdcegfD 、adcbgef4. 设图G 的邻接矩阵A=⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡010101010,则G 中共有(C )个顶点;若G 为有向图,则G 中共有(D )条弧;若G 为无向图,则G 中共有(B )条边。

A 、1B 、2C 、3D 、4E 、5F 、9G 、以上答案都不对5. 含n 个顶点的图,最少有(B )个连通分量,最多有(D )个连通分量。

A 、0B 、1C 、n-1D 、n6. 用邻接表存储图所用的空间大小(A )。

A 、与图的顶点数和边数都有关B 、只与图的边数有关C 、只与图的顶点数有关D 、与边数的平方有关7. n 个顶点的无向图的邻接表最多有(B )个表结点。

A 、n 2B 、n(n-1)C 、n(n+1)D 、n(n-1)/28. 无向图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)},对该图进行深度优先遍历,得到的顶点序列正确的是(D )。

数据结构错题

一、图【1】各边权值不同的无向连通图的最小生成树是唯一的【2】当各边上的权值( 均相等)时,BFS算法可用来解决单源最短路径问题解析:当权值相同,则最短路径问题转化为求边数最少的问题,BFS可以保证求得源点到汇点的最少边数【3】无向图:若V(G)中任意两个不同的顶点vi和vj都连通(即有路径),则称G为连通图。

无向图G的极大连通子图称为G的最强连通分量有向图:有向图G中,若对于V(G)中任意两个不同的顶点vi和vj,都存在从vi到vj以及从vj到vi 的路径,则称G是强连通图。

有向图的极大强连通子图称为G的强连通分量。

【4】无向图存储:邻接矩阵、邻接表、多重邻接表有向图存储:邻接矩阵、邻接表、十字链表【5】若有向图不存在回路,即使不用访问标志位同一结点也不会被访问两次()解析:错误。

如果一个点的入度大于1的话,就有可能被多次访问【6】有向图是否有环的判定算法,主要有深度优先和拓扑排序两种方法。

【7】一个AOV网应该是一个有向无环图,即不应该带有回路,因为若带有回路,则回路上的所有活动都无法进行。

既然AOV网是一个有向无环图,则其必然存在拓扑序列。

【8】关键路径:1)顶点表示事件,弧表示活动2)如果顶点A->B有弧,如果让弧表示为L,则A为L的弧尾,B为L的弧头,即有箭头的那一端叫头。

【9】若无向图G = (V.E)中含7个顶点,则保证图G在任何情况下都是连通的,则需要的边数最少是()解析:任何情况都连通的最少边数表示边分布最浪费的最少边情况,取点数减一的完全图6*5/2=15再加一条边得结果16【10】AOE网的定义:在带权有向图中若以顶点表示事件,有向边表示活动,边上的权值表示该活动持续的时间,这样的图简称为AOE网。

从定义上来看,很容易看出两种网的不同,AOV网的活动以顶点表示,而AOE网的活动以有向边来表示,AOV网的有向边仅仅表示活动的先后次序。

纵观这两种网图,其实它们总体网络结构是一样的,仅仅是活动所表示的方式不同,因此可以猜想从AOV网转换成AOE网应该是可行的。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档