图实训.docx
《图实训.docx》由会员分享,可在线阅读,更多相关《图实训.docx(16页珍藏版)》请在冰豆网上搜索。
图实训
数学与计算机学院
实验报告
(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.通过本次实验,你有些什么收获?
有什么不足?
答:
通过本次实验,我对图的基本操作有所了解,熟悉了邻接链表用于存储图这种存储结构的用法。
同时也对深度优先遍历有了更深一步的了解。
学会了在遍历的时候使用标记元素来作为是否遍历完成的标志。
在本次实验中我也存在很多不足,比如想法不够全面,考虑的情况不够详细,导致程序出现了很多不完整的地方,但是通过请教同学,查阅资料等,都慢慢解决了这些棘手的问题。
五、指导教师评语
成绩
批阅人
日期