图的深度优先遍历和广度优先遍历 c++
第一部分是用邻接表创建的图,具体注释可参见我的第一篇文章
// typedef struct ArcNode
{
int adjvex;
int info;
struct ArcNode *next;
} ArcNode;
typedef struct VNode
{
int data;
struct ArcNode *firstarc;
} VNode,AdjList[maxnum];
typedef struct
{
AdjList vertices;
int vexnum,arcnum;
}ALGraph;
int LocateVex(ALGraph g,int v1)
{
for(int i=0; i<g.vexnum; i++)
if(g.vertices[i].data==v1)
return i;
}
void creat(ALGraph &g)
{
int v1,v2,w;
cin>>g.vexnum>>g.arcnum;
for(int i=0;i<g.vexnum;i++)
{
cin>>g.vertices[i].data;
g.vertices[i].firstarc=NULL;
}
for(int k=0;k<g.arcnum;k++)
{
cin>>v1>>v2>>w;
int i=LocateVex(g,v1);
int j=LocateVex(g,v2);
ArcNode *p1,*p2;
p1=p2=new ArcNode;
p1->adjvex=j;
p1->info=w;
p1->next=g.vertices[i].firstarc;
g.vertices[i].firstarc=p1;
p2->adjvex=i;
p2->info=w;
p2->next=g.vertices[j].firstarc;
g.vertices[j].firstarc=p2;
}
}
//
int visited[1000]={0};//放一个总的判断数组,用来判断该位置的结点是否被访问,若被访问则置为1,否则为0,这了也可以是用bool类型数组定义:bool visited[1000];
void DFS(ALGraph &g, int i)//深度优先遍历,若只是连通图,可省略DFS1,因为从任意一个结点开始就可以遍历完所有结点
{
cout<<i<<endl;//先输出该结点
visited[i]=1;//结点标识置为1
ArcNode *p;
p=g.vertices[i].firstarc;//p指向该结点的邻接点
while(p)//若p不空,即访问i的所有邻接点
{
if(visited[p->adjvex]==0)
DFS(g,p->adjvex);//递归调用
else
p=p->next;
}
}
void DFS1(ALGraph &g)//非连通图的深度优先遍历,需要一遍遍选取新的初始结点,以保证所有的结点都被访问
{
for(int i=0;i<g.vexnum;i++)
if(visited[i]==0)
DFS(g,i);
}
void BFS(ALGraph &g,int i)//连通图的广度优先遍历
{
int Q[1000],front=0,rear=0;//定义队列并初始化
cout<<i<<endl;
visited[i]=1;//输出结点并置对应标识为1
Q[++rear]=i;//进队列
ArcNode *p;
while(front!=rear)
{
int w=Q[++front];
p=g.vertices[w].firstarc;//从初始结点开始遍历,当该结点的所有邻接点都被访问完之后,选取第一个进队列的结点开始重新遍历其所有邻接点
while(p)
{
if(visited[p->adjvex]==0)
{
cout<<p->adjvex;
visited[p->adjvex]=1;
Q[++rear]=p->adjvex;
p=p->next;
}
else
p=p->next;
}
}
}
void BFS1(ALGraph g)//非连通图的广度优先遍历,需要一遍遍选取新的初始结点,以保证所有的结点都被访问
{
for(int i=0;i<g.vexnum;i++)
if(visited[i]==0)
BFS(g,i);
}