图的遍历和联通
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
成都信息工程学院计算机系
课
程
实
验
报
告
一【上机实验目的】
给定一图,在遍历的基础上确定其是否是连通。
熟悉图的存储结构,深度和广度遍历以及其连通等。
二【实验环境】
PC机每人1台
三【上机实验内容】
给定一图,在遍历的基础上确定其是否是连通。
其中要掌握图的存储结构在此基础上才能知道怎么遍历,然后要把深度遍历和广度遍历分析透,最后才解决连通的问题。
四【上机调试程序流程图】(注:可打印)(用传统流程图的形式表示)
邻接矩阵存储
L G)
深度优先遍历
int dfs(algraph gra,int i)
判断图是否连通
gl,int n,int e)
int bfstra_fen(algraph gra)
五【上机调试中出现的错误信息、错误原因及解决办法】
上机过程中遇到了很多的问题,小到变量的引用,全局量的运用,地址符,指针等等。
其实这些都还好,自己可以一步一步慢慢地解决,最困难的就是一些逻辑错误,严重的时候会出现刷屏或者死机什么什么的。
六【上机调试后的源程序及还存在的问题】(注:源程序可打印)
(同时记录下你对你编写此程序的其它具体想法,)
#include <iostream>
#include <>
using namespace std;
#define int_max 10000
#define inf 9999
#define max 20
#define OK 1
dj=int_max;
[i][j].info=NULL;
}
for(int k=0;k!=;++k)
{
cout<<"输入一条边依附的顶点和权例如:(a b 3)不包括“()”"<<endl;
cin>>v1>>v2>>w;dj=w;
[j][i].adj=w;
}
cout<<"图G邻接矩阵创建成功!"<<endl;
return ;
}
void ljjzprint(MGraph_L G) dj<<" ";
cout<<endl;
}
}
int visited[max];ata=[i];
[i].firstarc=NULL;
}
for(i=0;i!=;++i)
{
for(j=0;j!=;++j)
{
if[i].firstarc==NULL)
{
if[i][j].adj!=int_max&&j!=
{
arc=(arcnode *)malloc(sizeof(arcnode));
arc->adjvex=j;
[i].firstarc=arc;
arc->nextarc=NULL;
p=arc;
++j;
while[i][j].adj!=int_max&&j!=
{
tem=(arcnode *)malloc(sizeof(arcnode));
tem->adjvex=j;
[i].firstarc=tem;
tem->nextarc=arc;
arc=tem;
++j;
}
--j;
}
}
else
{
if[i][j].adj!=int_max&&j!=
{
arc=(arcnode *)malloc(sizeof(arcnode));
arc->adjvex=j;
p->nextarc=arc;
arc->nextarc=NULL;
p=arc;
}
}
}
}
=;
=;
cout<<"图G邻接表创建成功!"<<endl;
return 1;
}
void adjprint(algraph gra) irstarc;
while(p!=NULL)
{
cout<<p->adjvex;
p=p->nextarc;
}
cout<<endl;
}
}
int firstadjvex(algraph gra,vnode v)ata;
enqueue(q,i);
while(!queueempty(q))
{
dequeue(q,e);
for(we=firstadjvex(gra,[e]);we>=0;we=nextadjvex(gra,[e],we))
{
if(!visited[we])
{
visited[we]=1;
cout<<[we].data;
enqueue(q,we);
}
}
}
}
}
int dfs(algraph gra,int i)ata;
for(we=firstadjvex(gra,[i]);we>=0;we=nextadjvex(gra,[i],we))
{
we1=we;
if(visited[we]==0)
dfs(gra,we);
we=we1;
}
return 1;
}
int dfstra(algraph gra)
{
int i,j;
for(i=0;i!=;++i)
{
visited[i]=0;
}
for(j=0;j!=;++j)
{
if(visited[j]==0)
dfs(gra,j);
}
return 0;
}
/*判断图GL是否连通*/
void judgeconnect(algraph gl,int n,int e) {
int i,b;
int temp = 0; //temp记录图中的边数e
b = 1;
temp = n - 1;
if(e < n-1) { //如果边数e小于定点数n-1,则图肯定不连通cout<<"这个图是不连通的!因为e < n-1。
"<<endl;
}
else {
if(e > (n-1)*(n-2)/2) //如果边数e大于C(n-1,2),则图肯定连通cout<<"这个图是连通的!因为e > C(n-1,2)。
"<<endl;
else {
for(i = 0;i < n; i++) //初始化访问标志数组
visited[i] = 0;
dfs(gl,0); //如果该图连通,则从第一个顶点0经过深度优先
cout<<endl; //搜索肯定可以遍历所有顶点
if(temp == 0)
cout<<"这个图是连通的!"<<endl;
else
cout<<"这个图是不连通的!"<<endl;
}
}
}
int bfstra_fen(algraph gra)//求连通分量
{
int i,j;
for(i=0;i!=;++i)
visited[i]=0;
for(j=0;j!=;++j)
{
if(visited[j]==0)
{
dfs(gra,j);
cout<<endl;
}
}
return 0;
}
int main()
{
algraph gra;
MGraph_L G;
int i,d;
char a='a';
d=creatMGraph_L(G);
creatadj(gra,G);
cout<<"…………………菜单……………………"<<endl<<endl;
cout<<"0、显示该图的邻接矩阵……………………"<<endl;
cout<<"1、显示该图的邻接表……………………"<<endl;
cout<<"2、广度优先遍历…………………………"<<endl;
cout<<"3、深度优先遍历…………………………"<<endl;
cout<<"4、判断图是否连通………………………"<<endl;
cout<<"5、该图的连通分量………………………"<<endl<<endl; int s;
char y='y';
while(y='y')
{
cout<<"请选择菜单:"<<endl;
cin>>s;
switch(s)
{
case 0:
cout<<"邻接矩阵显示如下:"<<endl;
ljjzprint(G);
break;
case 1:
cout<<"邻接表显示如下:"<<endl;
adjprint(gra);
break;
case 2:
cout<<"广度优先遍历:"<<endl;
bfstra(gra);
cout<<endl;
break;
case 3:
for(i=0;i!=;++i)
{
visited[i]=0;
}
cout<<"深度优先遍历:"<<endl;
dfstra(gra);
cout<<endl;
break;
case 4:
cout<<"图是否连通"<<endl;
judgeconnect(gra,,;
break;
case 5:
cout<<"连通分量:"<<endl;
bfstra_fen(gra);
break;
}
cout<<endl<<"是否继续?y/n:";
cin>>y;
if(y=='n')
break;
}
}
七【上机实验中的其他它问题及心得】
尽管对于有些人这种程序会很简单,可对以前不怎么爱编程的我来说,已经很不容易了。
因为以前的线性表我只实现了顺序存储,链式的还没有编程,所以自己编起来就有点吃力。
刚开始接到这个题的时候觉得应该还好吧,大部分的思想老师是讲过的,但是真的让自己实现起来却是困难重重。
先说存储吧,我都不知道怎么才能把一个图建立起来,书上有的只是无向网的一点伪代码,然而最终的遍历我想用邻接链表,然而对于邻接链表也只知道一些理论的知识,书上老师课件上都没有代码,所以就要和自己所学的线性表链表一起来建立。
所以首先我自己觉得有必要把线性表的部分给实现一下,因此我动手编的时候没有马上就着手自己项目的程序设计,而是做了一些基础的编程。
最后就是连通的问题了,连通我是通过计算边与点的关系先进行初步的判断,在初步不能判断的情况下然后由深度遍历的基础上判断的,也是在这基础上进行的连通分量的。
虽然对着电脑做程序,有点累有点热,可是当看到劳动成果时,真是别有一番滋味在心头啊!世上无难事,只怕有心人,的确如此程序设计过程有如解决一实际问题,从解决实际问题的角度,可以这样来看:首先要了解这个问题的基本要求,即输入、输出、完成
从输入到输出的要求是什么;其次,从问题的要害入手,从前到后的解决问题的每个方面,即从输入开始入手,着重考虑如何从输入导出输出,在这个过程中,可确定所需的变量、数组、函数,然后确定处理过程--算法。
当现在敲打这些字的时候,满足感油然而生,如果有人问我物质和精神哪个更让人满足,那答案一定是精神,那种感觉只有自己体会了才能懂。
很感谢这次的课程设计,它使我更加深刻地体会到多看专业书的重要性,只有掌握了一定量的专业知识才能得心应手地解决诸多问题;另外,做任何事都要有耐心,不要一遇到困难就退缩。
相比之下,原来唱歌,打球是那么好学。