本文主要是介绍用邻接表实现该图的广度优先搜索遍历,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
#include<iostream.h>
const intn=8; //表示图中的最大顶点数
const inte=15; //图中的最大边数
typedefint elemtype;
boolvisited[n+1]; //标志数组用于记载某个顶点是否被访问过
classlink //定义链表类型
{
public:
elemtype data;
link *next;
};
classGRAPH //定义邻接表的表头类型
{
public:
linka[n+1];
voidcreatlink() //建立图的邻接表
{
inti,j,k;
link *s;
for(i=1;i<=n;i++) //建立邻接表的表头类型
{
a[i].data=i;
a[i].next=NULL;
}
for(k=1;k<=e;k++)
{
cout<<"请输入一条边";
cin>>i>>j; //输入一条边(i,j)
cout<<endl;
s=newlink; //申请一个动态存储单元
s->data=j;
s->next=a[i].next; //头插法建立链表
a[i].next=s; //头插法建立链表
s=newlink;
s->data=i;
s->next=a[j].next; //头插法建立链表
a[j].next=s; //头插法建立链表
}
}
voidbfs1(int i) //用邻接表从顶点i出发进行广度优先搜索遍历
{
intq[n+1]; //定义队列
int f,r;
link*p; //p为搜索指针
f=r=0;
cout<<a[i].data<<"";
visited[i]=true;
r++;
q[r]=i; //进队
while(f<r)
{
f++;
i=q[f]; //出队
p=a[i].next;
while(p!=NULL)
{
if(!visited[p->data])
{
cout<<a[p->data].data<<"";
visited[p->data]=true;
r++;
q[r]=p->data; //进队
}
p=p->next;
}
}
}
};
voidmain()
{
link *p;
int yn=1;
GRAPH G;
G.creatlink(); //建立邻接表
while(yn==1)
{
for(inti=1;i<=n;i++) //输出邻接表
{
p=G.a[i].next;
cout<<G.a[i].data<<"->";
while(p->next!=NULL)
{
cout<<p->data<<"->";
p=p->next;
}
cout<<p->data<<endl;
}
for(i=1;i<=n;i++)
visited[i]=false;
cout<<"请输入广度优先搜索开始访问的顶点";
cin>>i;
cout<<endl;
cout<<"从"<<i<<"出发的广度优先搜索遍历序列为"<<endl;
G.bfs1(i);
cout<<endl;
cout<<"继续遍历吗(1/2)?";
cin>>yn;
}
}
这篇关于用邻接表实现该图的广度优先搜索遍历的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!