图的遍历-广度优先和深度优先遍历
2017-06-10 21:25
369 查看
图的遍历
概念从给定图中任意指定的顶点出发,按照某种搜索方法沿着图的边访问图中的所有顶点,使每个顶点仅被访问一次,这个过程就是图的遍历。方法有两种:深度优先遍历(DFS)和广度优先遍历(BFS)。
从顶点0开始进行深度优先遍历,可以得到如下访问序列:0 1 2 4 3 或 0 3 2 4 1。
从顶点0开始进行广度优先遍历,可以得到如下访问序列:0 1 3 2 4或 0 3 1 2 4。
上代码
#include<stdio.h> #include <malloc.h> #include <iostream> using namespace std; #define maxv 5 //图的邻接矩阵 typedef struct { int edges[maxv][maxv]; int n;//n个顶点 }MGraph; //图的邻接表 typedef struct Node//边节点 { int adjvex;//边的终点编号 Node *nextarc; //int info;边的信息,例如权值 }ArcNode; typedef struct//表头 { int data; ArcNode *firstarc; }VNode; typedef struct { VNode adjlist[maxv]; int n; }ALGraph; int visited[maxv]={0}; //初始化图(邻接矩阵) MGraph InitMGraph(){ MGraph mg; mg.n = 5; for(int i=0;i<mg.n;i++) for(int j=0;j<mg.n;j++) mg.edges[i][j] = 0; mg.edges[0][1] = 1; mg.edges[0][3] = 1; mg.edges[1][2] = 1; mg.edges[2][4] = 1; mg.edges[3][2] = 1; return mg; } //邻接矩阵转化为邻接表 void MaToList(MGraph mg,ALGraph *&alg) { alg = (ALGraph *)malloc(sizeof(ALGraph)); ArcNode *p; for(int k=0;k<mg.n;k++) alg->adjlist[k].firstarc = NULL; for(int i=0;i<mg.n;i++) for(int j=mg.n-1;j>=0;j--) { if (mg.edges[i][j]==1) { p = (ArcNode *)malloc(sizeof(ArcNode)); p->adjvex = j; p->nextarc = alg->adjlist[i].firstarc; alg->adjlist[i].firstarc = p; } } alg->n = mg.n; } //DFS深度优先 void DFS(ALGraph *alg,int v) { ArcNode *p; p = alg->adjlist[v].firstarc; visited[v] = 1; printf("%2d",v); while(p!=NULL) { if(visited[p->adjvex]==0) DFS(alg,p->adjvex); p = p->nextarc; } } //引入队列,广度优先 void BFS(ALGraph *alg,int v) { int queue[maxv],rear =0,front = 0; int currentV;//当前顶点 for(int i=0;i<maxv;i++) visited[i] = 0; rear = (rear+1)%maxv; queue[rear] = v; visited[v] = 1; printf("%2d",v); ArcNode *p; while(rear!=front) { front = (front+1)%maxv; currentV = queue[front]; p = alg->adjlist[currentV].firstarc; while(p!=NULL) { if(visited[p->adjvex]==0) { visited[p->adjvex] = 1; rear = (rear+1)%maxv; queue[rear] = p->adjvex; printf("%2d",p->adjvex); } p = p->nextarc; } } printf("\n"); } int main() { ALGraph *alg; alg = (ALGraph *)malloc(sizeof(ALGraph)); MaToList(InitMGraph(),alg); DFS(alg,0);//从顶点0开始 printf("\n"); BFS(alg,0); return 0; }
相关文章推荐
- 图(图的存储和图的遍历即深度优先搜索遍历图和广度优先搜索遍历图)
- 树的非递归遍历(深度优先:前|中|后序遍历) & (广度优先:层次遍历)
- 【数据结构】邻接表表示法的图的深度广度优先遍历递归和非递归遍历
- 泛型应用--图的深度(广度)优先遍历.成语接龙例子,含代码下载.
- 图的深度优先及广度优先遍历
- 邻接矩阵深度优先和广度优先遍历(DFS和BFS)
- 二叉树的广度优先遍历、深度优先遍历的递归和非递归实现方式
- 图的理解:深度优先和广度优先遍历及其 Java 实现
- 深度优先遍历与广度优先遍历 递归与非递归思路
- 数据结构:图的遍历--深度优先、广度优先
- 图 深度优先遍历 广度优先遍历 非递归遍历 图解算法过程
- 二叉树的深度优先和广度优先遍历
- 深度优先遍历和广度优先遍历思考
- 图的邻接矩阵存储:深度、广度优先遍历
- 矩阵版本图的深度优先和广度优先遍历
- (c++)二叉树的广度优先遍历和深度优先遍历
- 图的邻接矩阵存储表示 深度优先和广度优先遍历
- 树的深度优先与广度优先遍历
- 二叉树搜索树遍历--前序、中序、后序、深度优先、广度优先遍历的简单实现
- 邻接表存储图,深度和广度优先遍历