关键词不能为空

当前您在: 主页 > 英语 >

数据结构实验-图的遍历和最小生成树

作者:高考题库网
来源:https://www.bjmy2z.cn/gaokao
2021-02-01 21:24
tags:

-

2021年2月1日发(作者:connecting)


实验名称:图的遍历和最小生成树



实验内容




给定无向带权图


G


如下,



3


v


2



24


8


6


9


v


7



3


4


v


5



7


2


3


v


3



v


6



5


v


1




15


v


4




1.



请分 别用深度优先和广度优先两种方法从结点


v


1

< br>开始对


G


进行遍历。



2.



构造


G


的最小生成树。



编程完成上述功能。



要求




1.



必须完成图的存储功能。图的输入可由命令行完成。



2.



按遍历到的先后顺序依次输出< /p>


G


中各结点内容。



3.



以文本形式输出生成树中各条边以及它们的权值。




一、



概要设计





图的存储使用数组表示法,即邻接矩阵存储,结构体包含图的邻接矩阵,当前顶点数和< /p>


弧数。图的初始化使用二重循环得到顶点和表的权值,邻接矩阵的打印使用二重

< p>
for


循环。


然后把图各边的权值按从小到大排序 ;然后依次把最小边加入进来,即生成最小生成树。



克鲁斯卡尔算法:


假设



WN=(V


,{E})


是一个含有



n

个顶点的连通网,


按照构造最小生成树


的过程为:先构造一 个只含



n


个顶点,而边集为空的子图,之后,从网的边集



E


中选取


一条权值最小的边,


若该条边的两个顶点分属不同的树,


则将其加入子图,


反之,


若该条边


的两个顶点已落在同一棵树上,


则不可取,


而应该取下一条权值最小的边再试之。

依次类推,


直至只有一棵树,也即子图中含有



n-1


条边为止。




图的抽象数据类型


:


ADT Graph{


数据对象


V: V


是具有相同特性的数据元素的集合


,


称为点集


.


数据关系


R:


R={VR}


VR={(v,w)|v,w

< br>属于


V


,(v,w)


表示


v



w


之间存在的路 径


}


基本操作


P:


CreatGraph(&G,V,VR)


初始条件


:V


是图的顶点集


,VR


是图中弧的集合


.


操作结果


:



V



VR


是定义构造图


G


.


Sort(edge* ,MGraph *)


初始条件


:



G


存在,各边权值已知;



操作结果


:


对权值进行排序;



Find(int *, int )


初始条件


:


前者为已存在的集合,后者为集合中的元素;


< /p>


操作结果


:


查找函数,确定后者所属子集 ;



MiniSpanTree(MGraph *)


初始条件


:



G


存在,各边权值已知;



操作结果


:


生成最小树;



Swapn(edge *, int, int)


初始条件


:



G


存在,各边权值已知;



操作结果


:


交换某两个边的权值;



2


图的存储结构



typedef struct


{



int adj;



int weight;


}AdjMatrix[MAX][MAX];



typedef struct


{



AdjMatrix arc;



int vexnum, arcnum;


}MGraph;



typedef struct



{



int begin;



int end;



int weight;


}edge;


3


本程序包含的模块



}


1


)初始化操作,结构体定义;



2


)函数声明模块;



3


)函数定义模块;



4


)主程序模块





Main()


{


调用函数生成图;



判断图是否为空;


(空则从新输入)



调用函数生成最小生成树;



退出;




二、详细设计



#include


#include


using namespace std;



#define int_max 10000


#define inf 9999



#define max 20


//


…………………………………………邻接矩阵定义……………………



typedef struct ArcCell


{


int adj;


char *info;


}ArcCell,AdjMatrix[max][max];


typedef struct



{


char vexs[max];


AdjMatrix arcs;


int vexnum,arcnum;


}MGraph_L;


//^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^


int localvex(MGraph_L G


,char v)//


返回


V


的位置



{


int i=0;


while(G


.vexs[i]!=v)


++i;


return i;


}



int creatMGraph_L(MGraph_L &G)//


创建图用邻接矩阵表示



{


char v1,v2;


int i,j,w;



G


.vexnum=7;=12;


for(i=0;i!=;++i)


{

cout<<


输入顶点


V


cin> >G


.vexs[i];


}


for(i=0;i!=;++i)


for(j=0;j!=;++j)


{






G


.arcs[i][j].adj=int_max;





G


.arcs[i][j].info=NULL;


}


G


.arcs[0][1].adj=24;


G


.arcs[1][0].adj=24;


G


.arcs[0][2].adj=8;


G


.arcs[2][0].adj=8;


G


.arcs[0][3].adj=15;


G


.arcs[3][0].adj=15;


G


.arcs[1][4].adj=6;


G


.arcs[4][1].adj=6;


G


.arcs[1][6].adj=3;


G


.arcs[6][1].adj=3;


G


.arcs[2][4].adj=7;


G


.arcs[4][2].adj=7;


G


.arcs[2][5].adj=3;


G


.arcs[5][2].adj=3;


G


.arcs[3][5].adj=5;


G


.arcs[5][3].adj=5;


G


.arcs[3][6].adj=4;


[6][3].adj=4;


G


.arcs[4][5].adj=2;


G


.arcs[5][4].adj=2;


G


.arcs[4][6].adj=9;


G


.arcs[6][4].adj=9;


G


.arcs[5][6].adj=3;


G


.arcs[6][5].adj=3;

< br>cout<<



G


邻接矩阵创建 成功!



return G


.vexnum;


}


void ljjzprint(MGraph_L G) //


邻接矩阵的输出




{


int i,j;


for(i=0;i!=;++i)


{





for(j=0;j!=;++j)






cout<<[i][j].adj<<





cout<


}


}


int visited[max];//


访问标记



int we;


typedef struct arcnode//


弧结点



{


int adjvex;//


该弧指向的顶点的位置



struct arcnode *nextarc;//


弧尾相同的下一条弧



char *info;//


该弧信息



}arcnode;


typedef struct vnode//


邻接链表顶点头接点



{


char data;//


结点信息



arcnode *firstarc;//


指向第一条依附该结点的弧的指针



}vnode,adjlist;


typedef struct//


图的定义



{


adjlist vertices[max];


int vexnum,arcnum;


int kind;


}algraph;


//


…………… ……………………………队列定义……………………



typedef struct qnode


{


int data;


struct qnode *next;


}qnode,*queueptr;


typedef struct


{


queueptr front;


queueptr rear;


}linkqueue;


//

< br>………………………………………………………………………



typedef struct acr


{


int pre;//


弧的一结点



int bak;//


弧另一结点



int weight;//


弧的权



}edg;



int creatadj(algraph &gra,MGraph_L G)//


用邻接表存储图



{


int i=0,j=0;


arcnode *arc,*tem,*p;


for(i=0;i!=;++i)


{


es[i].data=[i];


es[i].firstarc=NULL;


}


for(i=0;i!=;++i)


{


for(j=0;j!=;++j)


{





if(es[i].firstarc==NULL)





{






if( G


.arcs[i][j].adj!=int_max&&j!=G

< br>.vexnum)






{







arc=(arcnode *)malloc(sizeof(arcnode));







arc->adjvex=j;







es[i].firstarc=arc;







arc->nextarc=NULL;







p=arc;







++j;







whi le([i][j].adj!=int_max&&j!=G


.vexnum)







{








tem=(arcnode *)malloc(sizeof(arcnode));








tem->adjvex=j;












es[i].firstarc=tem;








tem->nextarc=arc;








arc=tem;








++j;







}







--j;






}





}





else





{






if(G


.arcs[i][j].adj!=int_max&& j!=G


.vexnum)






{







arc=(arcnode *)malloc(sizeof(arcnode));







arc->adjvex=j;







p->nextarc=arc;







arc->nextarc=NULL;







p=arc;






}





}


}


}


=;


=;


return 1;


}



int firstadjvex(algraph gra,vnode v)//< /p>


返回依附顶点


V


的第一个点







































//


即以


V


为尾的第一个结点



{


if(rc!=NULL)


return rc->adjvex;


}


int nextadjvex(algraph gra,vnode v,int w)//


返回依附顶点


V


的相对于


W

< p>
的下一个顶点



{


arcnode *p;


p=rc;


while(p!=NULL&&p->adjvex!=w)


{





p=p->nextarc;


}


if(p->adjvex==w&&p->nextarc!=NULL)


{





p=p->nextarc;






return p->adjvex;


}


if(p->adjvex==w&&p->nextarc==NULL)


return -10;


}


int initqueue(linkqueue &q)//


初始化队列



{


=(queueptr)malloc(sizeof(qnode));


=;


if(!)


return 0;


->next=NULL;


return 1;


}


int enqueue(linkqueue &q,int e)//


入队



{


queueptr p;


p=(queueptr)malloc(sizeof(qnode));


if(!p)


return 0;


p->data=e;


p->next=NULL;


->next=p;


=p;


return 1;


}


int dequeue(linkqueue &q,int &e)//


出队



{


queueptr p;


if(==)

-


-


-


-


-


-


-


-



本文更新与2021-02-01 21:24,由作者提供,不代表本网站立场,转载请注明出处:https://www.bjmy2z.cn/gaokao/595176.html

数据结构实验-图的遍历和最小生成树的相关文章

  • 余华爱情经典语录,余华爱情句子

    余华的经典语录——余华《第七天》40、我不怕死,一点都不怕,只怕再也不能看见你——余华《第七天》4可是我再也没遇到一个像福贵这样令我难忘的人了,对自己的经历如此清楚,

    语文
  • 心情低落的图片压抑,心情低落的图片发朋友圈

    心情压抑的图片(心太累没人理解的说说带图片)1、有时候很想找个人倾诉一下,却又不知从何说起,最终是什么也不说,只想快点睡过去,告诉自己,明天就好了。有时候,突然会觉得

    语文
  • 经典古训100句图片大全,古训名言警句

    古代经典励志名言100句译:好的药物味苦但对治病有利;忠言劝诫的话听起来不顺耳却对人的行为有利。3良言一句三冬暖,恶语伤人六月寒。喷泉的高度不会超过它的源头;一个人的事

    语文
  • 关于青春奋斗的名人名言鲁迅,关于青年奋斗的名言鲁迅

    鲁迅名言名句大全励志1、世上本没有路,走的人多了自然便成了路。下面是我整理的鲁迅先生的名言名句大全,希望对你有所帮助!当生存时,还是将遭践踏,将遭删刈,直至于死亡而

    语文
  • 三国群英单机版手游礼包码,三国群英手机单机版攻略

    三国群英传7五神兽洞有什么用那是多一个武将技能。青龙飞升召唤出东方的守护兽,神兽之一的青龙。玄武怒流召唤出北方的守护兽,神兽之一的玄武。白虎傲啸召唤出西方的守护兽,

    语文
  • 不收费的情感挽回专家电话,情感挽回免费咨询

    免费的情感挽回机构(揭秘情感挽回机构骗局)1、牛牛(化名)向上海市公安局金山分局报案,称自己为了挽回与女友的感情,被一家名为“实花教育咨询”的情感咨询机构诈骗4万余元。

    语文