图的遍历 与创建 邻接表与临接矩阵
2012-11-19 21:02
232 查看
http://blog.csdn.net/hackerain/article/details/6039194
#pragma once #include <iostream> using namespace std; // #define MAX 1000000 #define MAX_VERTEX_NUM 20 typedef enum{DG,DN,UDG,UDN}GraphKind; typedef struct { char vexs[MAX_VERTEX_NUM];//一维数组存储顶点信息 int edges[MAX_VERTEX_NUM][MAX_VERTEX_NUM];//二维数组存储顶点边的信息 int vertexnum,edgenum;//顶点数目和边 GraphKind kind;//图的种类 }MGraph; //创建无向图的邻接矩阵 void CreateUDG_AM(MGraph &G,int n,int e) { G.vertexnum=n; G.edgenum=e; int i,j,k; for(i=0;i<n;i++) cin>>G.vexs[i]; for(i=0;i<n;i++) for(j=0;j<n;j++) G.edges[i][j]=0; for(k=0;k<e;k++) { cin>>i>>j; // G.edges[i][j]=G.edges[j][i]=1;//输入边的信息 G.edges[i][j]=1; } } //无向图的深度优先遍历 int visited[MAX_VERTEX_NUM]; void DFS_AM(MGraph &G,int i) { int j; cout<<G.vexs[i]<<" "; visited[i]=1; for(j=0;j<G.vertexnum;j++) { if((G.edges[i][j])==1&&(visited[j]==0)) DFS_AM(G,j); } } void DFS_Traverse_AM(MGraph& G) { int i; for(i=0;i<G.vertexnum;i++) visited[i]=0; for(i=0;i<G.vertexnum;i++) if(!visited[i]) DFS_AM(G,i); } ////无向图的广度优先遍历 void BFS_Traverse_AM(MGraph& G) { int i,j,v; for(i=0;i<G.vertexnum;i++) visited[i]=0; std::queue<int> Q; for(i=0;i<G.vertexnum;i++) { if(!visited[i]) { cout<<G.vexs[i]<<" "; visited[i]=1; Q.push(i); while(!Q.empty()) { int v=Q.front(); Q.pop(); for(j=0;j<G.vertexnum;j++) { if(G.edges[v][j]&&!visited[j]) { cout<<G.vexs[j]<<" "; visited[j]=1; Q.push(j); } } } } } } /////////////////////////////////////////// ////邻接表//////////////////////// typedef struct EdgeNode { int adjvex;// struct EdgeNode* nextedge; int weight; }EdgeNode; typedef struct VexNode { char vex;//存放顶点的信息 EdgeNode *firstedge;//指向第一个编表节点 }VexNode; typedef struct { VexNode vexs[MAX_VERTEX_NUM]; int vexnum,edgenum; GraphKind kind; }LGraph; void CreateDG_AL(LGraph &G,int n,int e) { int i,j,k; G.vexnum=n; G.edgenum=e; G.kind=DG; for(i=0;i<n;i++) { cin>>G.vexs[i].vex; G.vexs[i].firstedge=NULL; } for(k=0;k<e;k++) { EdgeNode* p; cin>>i>>j; p=new EdgeNode; p->adjvex=j; p->nextedge=G.vexs[i].firstedge; G.vexs[i].firstedge=p;//头插法 } } //有向图的深度优先遍历 void DFS_AL(LGraph &G,int v) { int j; EdgeNode* p; cout<<G.vexs[v].vex<<" "; visited[v]=1; for(p=G.vexs[v].firstedge;p;p=p->nextedge) { j=p->adjvex; if(!visited[j]) DFS_AL(G,j); } } void DFS_Traverse_AL(LGraph &G) { int i; for(i=0;i<G.vexnum;i++) { visited[i]=0; } for(i=0;i<G.vexnum;i++) if(!visited[i]) DFS_AL(G,i); } ///有向图的广度 void BSF_Traverse_AL(LGraph &G) { int i,j,v; EdgeNode* p; for(i=0;i<G.vexnum;i++) visited[i]=0; std::queue<int> Q; for(i=0;i<G.vexnum;i++) { if(!visited[i]) { cout<<G.vexs[i].vex<<" "; visited[i]=1; Q.push(i); while(!Q.empty()) { v=Q.front(); Q.pop(); for(p=G.vexs[i].firstedge;p;p=p->nextedge) { j=p->adjvex; if(!visited[j]) { cout<<G.vexs[j].vex<<" "; visited[j]=1; Q.push(j); } } } } } }
相关文章推荐
- 邻接表无向图的创建和遍历(dfs)
- C++ 无向图 邻接表创建 广度遍历 深度遍历
- 图的邻接表的创建与遍历
- [置顶] 图:图的邻接矩阵创建、深度优先遍历和广度优先遍历详解
- 数据结构,图的邻接矩阵创建,邻接矩阵与邻接表的交换,两种表的输出,过程用C++实现
- 各种图的创建以及广度,深度优先遍历(临接矩阵存储)
- 邻接表实现的图创建及遍历源码
- 各种图的创建以及广度,深度优先遍历(临接矩阵存储)
- [置顶] 图:图的邻接表创建、深度优先遍历和广度优先遍历代码实现
- 找出图中的所有连通子图(创建图的邻接表,深度优先遍历查找子图)
- 图的邻接表的创建与遍历
- 图的邻接表创建与遍历(C语言)
- 图的邻接表创建以及遍历
- 连通图的(领接矩阵储存)创建和遍历(包含BFS,DFS两种算法)
- 图的邻接表存储、创建、深度优先遍历、广度优先遍历
- 关于有向图的邻接表的创建,深度遍历及广度遍历.
- 图之 宽度优先遍历 BFS 邻接表创建的图
- 建立有向图的邻接表,深度优先遍历和广度优先遍历的递归与非递归算法,判断是否是有向无环图,并输出一种拓扑序列
- 二叉树的创建、前序遍历、中序遍历、后序遍历
- 一维二维数组的创建与遍历