无向图的深度优先遍历和广度优先遍历(邻接链表)
2014-06-04 16:29
169 查看
我选的是邻接链表,建立如下图所示的图:
![](http://img.blog.csdn.net/20140603232017687?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbHh3X3hpYW5neXU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
我把它画出来,图是这样子的:
![](http://img.blog.csdn.net/20140603232107546?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbHh3X3hpYW5neXU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
对于深度优先遍历:是从一个顶点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。
我是这样理解的,读者可以根据自己的测试数据来理解,欢迎和我交流。
完整代码:
对于图的管
我把它画出来,图是这样子的:
对于深度优先遍历:是从一个顶点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; }
对于图的管
相关文章推荐
- 图的广度优先遍历BFS(分别以邻接矩阵和邻接链表实现)
- 邻接图的广度优先遍历和深度优先遍历
- 图的广度优先遍历,基于邻接链表实现
- java语言实现图的深度优先遍历与广度优先遍历
- 深度优先遍历 和 广度优先遍历
- 二叉树的深度优先遍历、广度优先遍历和非递归遍历
- 二叉树的深度优先遍历、广度优先遍历和非递归遍历
- 深度优先遍历和广度优先遍历
- 图邻接链表基本操作--广度优先、深度优先、拓扑排序
- 二叉树的深度优先遍历和广度优先遍历
- C++实现图的邻接矩阵的创建以及其深度优先遍历和广度优先遍历
- 普通树的深度优先遍历和广度优先遍历
- 用邻接表实现图的深度优先遍历、广度优先遍历、最短路径(无权图)
- 深度优先遍历与广度优先遍历 递归与非递归思路
- 二叉树的深度优先遍历(栈)和广度优先遍历(队列)
- 图的邻接矩阵存储:深度、广度优先遍历
- 二叉树的深度优先遍历与广度优先遍历 [C++实现]
- 二叉树的深度优先遍历与广度优先遍历 [ C++ 实现 ]
- 算法,树深度优先遍历与广度优先遍历
- 二叉树的深度优先遍历和广度优先遍历