您的位置:首页 > 其它

无向图的深度优先遍历和广度优先遍历(邻接链表)

2014-06-04 16:29 169 查看
我选的是邻接链表,建立如下图所示的图:



我把它画出来,图是这样子的:



对于深度优先遍历:是从一个顶点v出发,一步一步地向前推进,当找不到未访问过的顶点时,也是一步一步地回退。其过程类似于用栈求解迷宫问题的搜索方式。

比如上面这个图:我从4这个顶点开始遍历,它先访问它第一个邻接点1,然后1访问它的第一个邻接点4,发现4已经访问过了,然后访问第二个邻接点2,2访问第一个邻接点1,发现1已经被访问过,回退到1,1访问第三个邻接点3,3的第一个第二个邻接点已经被访问,我们就不访问它,最后回退到4,4访问第二个邻接点3,可是3已经被访问,我们就不访问了。

对于广度优先遍历:是从一个顶点v出发,先访问其所有相邻的未访问过的顶点。相当于以初始点为中心,一层一层地向外推进的。其过程类似于用队列求解迷宫问题的搜索方式。

比如上面这个图:我从4这个顶点开始访问,先访问1,接着访问3,然后访问和3相邻的顶点4、1,4、1都被访问过,回退访问1相邻的未访问的顶点1。

我是这样理解的,读者可以根据自己的测试数据来理解,欢迎和我交流。

完整代码:

#include <stdio.h>
#include <conio.h>
#include <malloc.h>
#define MAX_NUM 20
typedef struct ArcNode {
int adjvex;
struct ArcNode *nextarc;
}ArcNode;
typedef int VertexType;
typedef struct VNode {
VertexType data;
ArcNode *firstarc;
}VNode,AdjList[MAX_NUM];
void createDgraph(AdjList &g,int n){
ArcNode *p,*q;
int i,j;
for (i=1;i<=n;i++)
{
g[i].data=i;
g[i].firstarc=NULL;
}
printf("\nEdgei->j:");
scanf("%d%d",&i,&j);
while (i!=-1)
{
p=(ArcNode *)malloc(sizeof(ArcNode));
q=(ArcNode *)malloc(sizeof(ArcNode));
p->adjvex=j;
p->nextarc=g[i].firstarc;
g[i].firstarc=p;
q->adjvex=i;
q->nextarc=g[j].firstarc;
g[j].firstarc=q;
printf("\nEdge i->j:");
scanf("%d%d",&i,&j);
}
}
int visited[MAX_NUM]={0};
void DFS(AdjList G,int v){
ArcNode *p;
visited[v]=1;
printf("%d ",v);
p=G[v].firstarc;
while(p!=NULL){
if(visited[p->adjvex]==0){//若w=p->adjvex 顶点未访问,递归访问它
DFS(G,p->adjvex);
}
p=p->nextarc;//p指向顶点v的下一个邻接点
}
}

void BFS(AdjList G,int v){
ArcNode *p;
int Qu[20],front,rear;//定义循环队列
int visited[20]={0};
int w,i;
front=rear=0;//初始化队列
printf("%d ",v);
visited[v]=1;
rear=(rear+1)%20;
Qu[rear]=v;//v进队
while(front!=rear){
front=(front+1)%20;
w=Qu[front];//出队并赋给w
p=G[w].firstarc;//找与顶点w邻接的第一个顶点
while(p){
if(visited[p->adjvex]==0){//弱当前顶点未被访问
printf("%d ",p->adjvex);//访问邻接顶点
visited[p->adjvex]=1;
rear=(rear+1)%20;//该顶点进队
Qu[rear]=p->adjvex;
}
p=p->nextarc;
}
}
}
void printDgraph(AdjList g,int n){
ArcNode *p;
int i;
for (i=1;i<=n;i++)
{
printf("\n%d: ",g[i].data);
p=g[i].firstarc;
while (p)
{
printf("->%d",p->adjvex);
p=p->nextarc;
}
}
}
int main()
{
AdjList g;
int num;
printf("Input Number of Vertex:");
scanf("%d",&num);
createDgraph(g,num);
printDgraph(g,num);
printf("\n");
printf("深度优先:");
DFS(g,num);
printf("\n");
printf("广度优先:");
BFS(g,num);
printf("\n");
return 0;
}


对于图的管
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: