图实训.docx

上传人:b****3 文档编号:26430435 上传时间:2023-06-19 格式:DOCX 页数:16 大小:70.50KB
下载 相关 举报
图实训.docx_第1页
第1页 / 共16页
图实训.docx_第2页
第2页 / 共16页
图实训.docx_第3页
第3页 / 共16页
图实训.docx_第4页
第4页 / 共16页
图实训.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

图实训.docx

《图实训.docx》由会员分享,可在线阅读,更多相关《图实训.docx(16页珍藏版)》请在冰豆网上搜索。

图实训.docx

图实训

数学与计算机学院

实验报告

(2012/2013学年第1学期)

 

实验名称

图应用

指导教师

周立章

实验类型

□验证

√综合

实验学时

2+10

实验日期

实验时间

实验编号

分组号

实验地点

一、实验目的和要求

1.掌握图的基本存储方法:

邻接矩阵和邻接表。

2.掌握有关图的基本操作算法并能用高级语言实现。

3.掌握图的的深度优先搜索遍历和广度优先搜索遍历算法。

4.掌握图的最小生成树的两种算法。

实验要求:

(1)理解图顶点和边的存储方法:

邻接矩阵和邻接表;

(2)理解图的遍历算法,掌握其应用;(3)应用图的遍历算法判断图是否连通和两顶点间是否存在路径。

二、实验环境(实验设备)

硬件:

微型计算机P5

软件:

WindowsXP+MicrosoftVisualC++6.0

三、实验原理及内容

实验题目:

1.建立无向网的邻接表存储结构:

要求:

从键盘输入无向网的顶点数和边数;然后以“顶点1,顶点2,权值”的方式输入无向网的各边。

2.输出邻接表:

输出形式为:

顶点:

顶点编号权值->顶点编号权值->…

3.求出无向网中各顶点的度,并输出。

4.判断给定的无向网是否是通连网?

5.写一算法求无向网的连通分量的个数并输出各连通分量的顶点集合。

6.对该无向网进行深度优先搜索遍历,并显示遍历序列。

7.写一算法,删除无向网中指定的一条边。

8.写一算法,判断两个顶点Vi,Vj是否存在路径

实验前请完成邻接表的相关数据类型的定义,并确定一个连通的无向网和一个非连通的无向网,以用于测试。

实验前完成:

1-2小题

中完成:

3-7小题。

实验后完成:

完成8小题,做好所有测试并完成实验报告。

实验解答:

1.邻接表中边结点类型的结构体定义。

答:

structEdge{

intdest;

DistTweight;

Edge*next;

DistTweight;

};

2.邻接表中头结点的结构体定义

答:

structItem{

VerTdata;

Edge*adj;

};

 

3.邻接表的结构体定义

答:

structEdge{

intdest;

Edge*next;

};

structItem{

VerTdata;

Edge*adj;

};

4.给出用于测试的无向网和非连通无向网

答:

连通的无向网:

 

非连通无向网:

 

 

5.邻接表中相关操作:

假如无向网G,则

1)判断顶点i是否有度的语句是:

答:

p=Vertices[i].adj;

while(p!

=NULL)

{

d[i]++;

p=p->next;

}

if(d[i]==0)

cout<<"顶点"<

"<

else

cout<<"顶点"<

"<

2)求取顶点i的第一个边结点的语句是:

答:

p=Vertices[i].adj;

 

3)如何计算顶点i的度?

答:

p=Vertices[i].adj;

while(p!

=NULL)

{

d[i]++;

p=p->next;

}

 

6.写出无向网G的邻接表存储算法

答:

voidAdjTWGraph:

:

CreatG(intn,inte)

{

intvi,vj;

DistTw;

numE=e;

numV=n;

cout<<"\n输入顶点信息:

";

for(inti=0;i

{

cout<<"\n"<

";

cin>>Vertices[i].data;

}

for(i=0;i

{

cout<<"\n输入边的信息(Vi,Vj,W):

";

cin>>vi>>vj>>w;

if(vi<1||vi>numV||vj<1||vj>numV)

cout<<"\n定点越界"<

Edge*p=newEdge;

p->dest=vj-1;

p->weight=w;

p->next=NULL;

if(Vertices[vi-1].adj==NULL)

Vertices[vi-1].adj=p;

else

{

Edge*curr=Vertices[vi-1].adj,*pre=NULL;

while(curr!

=NULL&&curr->dest

{

pre=curr;

curr=curr->next;

}

if(pre==NULL)

{

p->next=Vertices[vi-1].adj;

Vertices[vi-1].adj=p;

}

else

{

p->next=pre->next;

pre->next=p;

}

}

Edge*q=newEdge;

q->dest=vi-1;

q->weight=w;

q->next=NULL;

if(Vertices[vj-1].adj==NULL)

Vertices[vj-1].adj=q;

else

{

Edge*curr=Vertices[vj-1].adj,*pre=NULL;

while(curr!

=NULL&&curr->dest

{

pre=curr;

curr=curr->next;

}

if(pre==NULL)

{

q->next=Vertices[vj-1].adj;

Vertices[vj-1].adj=q;

}

else

{

q->next=pre->next;

pre->next=q;

}

}

 

}

}

 

7.写出输出无向网邻接表算法。

答:

voidAdjTWGraph:

:

PrintG()

{

Edge*curr;

for(inti=0;i

{

cout<<"顶点:

"<

curr=Vertices[i].adj;

while(curr!

=NULL)

{

cout<weight<<"->"<dest+1<<"";

curr=curr->next;

}

cout<

}

}

 

8.写出求无向网中各顶点的度的算法。

答:

voidAdjTWGraph:

:

Gdegree()

{

Edge*p;

intd[MaxVertices];

for(inti=0;i

{

d[i]=0;

}

for(i=0;i

{

p=Vertices[i].adj;

while(p!

=NULL)

{

d[i]++;

p=p->next;

}

cout<<"顶点"<

"<

}

 

}

 

9.写出判断给定的无向网是否是通连网的算法。

答:

public中的方法:

voidGliantong(){

intk=0;

intv0;

intvisit[MaxVertices];

for(inti=0;i

{

visit[i]=0;

}

cout<<"\n请输入任意点作为起始点:

";

cin>>v0;

Gliantong(v0,visit,k);

if(k==numV)

{

cout<<"\n该无向图连通!

"<

}

else

cout<<"\n该无向图不连通!

"<

}

Private中的方法:

voidAdjTWGraph:

:

Gliantong(intv,intvisited[],int&n)

{

intvj;

Edge*p;

n++;

visited[v]=1;

p=Vertices[v].adj;

while(p!

=NULL)

{

vj=p->dest;

if(visited[vj]==0)

Gliantong(vj,visited,n);

p=p->next;

}

}

 

10.对该无向网进行深度优先搜索遍历,并显示遍历序列算法是?

答:

voidAdjTWGraph:

:

DepthFirst(intv,intvisited[])

{

intvj;

Edge*p;

visited[v]=1;

cout<

p=Vertices[v].adj;

while(p!

=NULL)

{

vj=p->dest;

if(visited[vj]==0)

DepthFirst(vj,visited);

p=p->next;

}

}

 

11.删除无向网中指定的一条边的算法代码?

答:

voidAdjTWGraph:

:

deleteside(intv,intvj)

{

Edge*p,*q;

p=Vertices[v].adj;

q=p;

if(p!

=NULL)

{

while(p!

=NULL)

{

if(p->dest==vj)

{

p=p->next;

deletep;

}

else

{

q=p;

p=p->next;

}

cout<<"\n删除成功!

"<

}

p=Vertices[vj].adj;

q=p;

while(p!

=NULL)

{

if(p->dest==v)

{

p=p->next;

deletep;

}

else

{

q=p;

p=p->next;

}

}

}

else

{

cout<<"\n要删除的边不存在!

"<

}

}

 

12.判断两个顶点Vi,Vj是否存在路径采用了哪个遍历算法?

代码是?

答:

采用了深度优先遍历算法,其代码如下:

voidAdjTWGraph:

:

Islujing(intv0,intv1,intvisited[],int&k)

{

intvj;

Edge*p;

p=Vertices[v0].adj;

visited[v0]=1;

while(p!

=NULL)

{

vj=p->dest;

if(vj==v1)

{

k=1;

}

elseif(visited[vj]==0)

{

Islujing(vj,v1,visited,k);

}

p=p->next;

}

}

 

13.画出该无向网的最小生成树。

答:

最小生成树如图所示:

10

30

20

四、实验小结(包括问题和解决方法、心得体会、意见与建议等)

1.画出图的邻接表存储结构图

答:

 

 

2.如果将无向网的邻接表改为邻接矩阵存储,请说说实现的思路。

答:

利用数组保存边和结点的信息。

循环输入边和点的信息,用一维数组保存点的信息,再用二维数组存放边的信息。

用数组循环来建立邻接距阵。

 

3.给出的测试使用的连通无向网是否完全无向图?

完全无向图的特点是什么?

答:

我用于测试的图不是完全无向图。

完全无向图的特点是若一个图G用n个结点,那么它的无向完全图应该有n(n-1)/2条边。

而我给出的图中,用4个结点,但是只有5条边。

故不是完全无向图。

 

4.通过本次实验,你有些什么收获?

有什么不足?

答:

通过本次实验,我对图的基本操作有所了解,熟悉了邻接链表用于存储图这种存储结构的用法。

同时也对深度优先遍历有了更深一步的了解。

学会了在遍历的时候使用标记元素来作为是否遍历完成的标志。

在本次实验中我也存在很多不足,比如想法不够全面,考虑的情况不够详细,导致程序出现了很多不完整的地方,但是通过请教同学,查阅资料等,都慢慢解决了这些棘手的问题。

 

五、指导教师评语

 

成绩

批阅人

日期

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 其它

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1