图的邻接矩阵存储:深度、广度优先遍历

1. 邻接矩阵存储描述如下:

#include <iostream> #include <string> #include “Queue.h” using namespace std; //图的邻接矩阵存储表示 #define INFINITY INT_MAX #define MAX_VERTEX_NUM 20 typedef enum {DG, DN, UDG, UDN} GraphKind; //{有向图,有向网,无向图,无向网} typedef enum {OK, ERROR} Status; typedef struct ArcCell{ int adj; //顶点关系类型。对于无权图,用0或1表示相邻否。对于有权图,则为权值类型。 string info; //该弧所携带的信息 }ArcCell, AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; typedef struct { int vexs[MAX_VERTEX_NUM]; //顶点向量 AdjMatrix arcs; //邻接矩阵 int vexnum, arcnum; //图的当前顶点数和弧数 GraphKind kind; //图的种类标志 }MGraph; bool visited[MAX_VERTEX_NUM]; //设访问标志数组,供遍历时使用 

 

2. 构造测试用的建立无向图的函数

void CreateUDGTest(MGraph &G) { //构造一个测试用的无向图 int i,j; //数组a[9][2]包含所有边 //int a[9][2] = {0,1,0,2,0,3,1,4,1,5,4,5,7,8,8,9,9,7}; int a[9][2] = { {0,1}, {0,2}, {0,3}, {1,4}, {1,5}, {4,5}, {7,8}, {8,9}, {9,7}}; G.kind = UDG; G.vexnum = 10; G.arcnum = 9; for(i=0; i<G.vexnum; ++i) //构造顶点向量 G.vexs[i] = i; for(i=0; i<G.vexnum; ++i) //初始化为全0 for(j=0; j<G.vexnum; ++j) G.arcs[i][j].adj = 0; for(i=0; i<G.arcnum; ++i) //对存在的边赋值1 G.arcs[a[i][0]][a[i][1]].adj = G.arcs[a[i][1]][a[i][0]].adj = 1; } 

 

3. 深度优先遍历和广度优先遍历函数

void DFSTraverse(MGraph G) { //对图G作深度优先遍历 int v; for(v=0; v<G.vexnum; ++v) //访问标志数组初始化 visited[v] = false; for(v=0; v<G.vexnum; ++v) if(!visited[v]) //对未访问的顶点调用DFS DFS(G, v); } void DFS(MGraph G, int v) { //从第v个顶点出发,递归地深度优先遍历图G int w; visited[v] = true; VisitFunc(v); //访问第v个顶点 for(w = FirstAdjVex(G,v); w>=0; w=NextAdjVex(G, v, w)) if(!visited[w]) DFS(G, w); //对v的尚未访问的邻接顶点w递归调用DFS } void BFSTraverse(MGraph G) { //按广度优先非递归地遍历图G。使用辅助队列Q和访问标志数组visited int v, w, u; LinkQueue Q; for(v=0; v<G.vexnum; ++v) //访问标志数组初始化 visited[v] = false; InitQueue(Q); //置空的辅助队列 for(v=0; v<G.vexnum; ++v) if(!visited[v]) { visited[v] = true; VisitFunc(v); EnQueue(Q,v); while(QueueEmpty(Q) == FALSE){ DeQueue(Q, u); //对头元素出队,并置为u for(w = FirstAdjVex(G,v); w>=0; w=NextAdjVex(G, v, w)) if(!visited[w]){ //w为u未访问的邻接顶点 visited[w] = true; VisitFunc(w); EnQueue(Q, w); } } }//if }//BFSTraverse void VisitFunc(int v) { //访问第v个节点 cout<<v<<endl; } int FirstAdjVex(MGraph G, int v) { //返回节点v的第一个邻接顶点 int i; for(i=0; i<G.vexnum; ++i) if(G.arcs[v][i].adj != 0 && i!=v) return i; return -1; //如果没有,返回-1 } int NextAdjVex(MGraph G, int v, int w) { //返回节点v的邻接顶点中w之后的下一个邻接顶点 int i; for(i=w+1; i<G.vexnum; ++i) if(G.arcs[v][i].adj != 0 && i!=v) return i; return -1; //如果没有,返回-1 } 

 

4. 主函数-测试用

int main() { MGraph gra; CreateUDGTest(gra); //构造无向图G cout<<“对无向图G作深度优先遍历:”<<endl; DFSTraverse(gra); //对无向图G作深度优先遍历 cout<<“对无向图G作广度优先遍历:”<<endl; BFSTraverse(gra); return 0; } 

 

结果图如下:

《图的邻接矩阵存储:深度、广度优先遍历》

    原文作者:数据结构之图
    原文地址: https://blog.csdn.net/hustspy1990/article/details/6041604
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞