c++中图的遍历,dfs和bfs的简单实现
2017-06-06 11:35
309 查看
下面是代码实现部分,感兴趣再在下面看相关知识 //代码实现部分 #include using namespace std; #define M 100000 int p = 1;//记录数组队列的当前下标,头指针 int s = 0;//记录数组队列下标的记忆下标,尾指针 int f[M];//数组队列 //dfs遍历 void dfs(int); //bfs遍历 void bfs(int); int G[6][6] = { { M, 1, 1, 1, M, M }, { 1, M, 1, M, 1, M }, { 1, 1, M, 1, 1, 1 }, { 1, M, 1, M, M, 1 }, { M, 1, 1, M, M, 1 }, { M, M, 1, 1, 1, M } }; bool d1v[6] = { false };//标志数组,dfs bool d2v[6] = { false };//标志数组,bfs //图的遍历 //深度优先搜索dfs //一直找一条路径,找到终端还没找完。 然后返回上一个节点再找,找完再返回 void dfs(int m)//采用递归形式完成 { d1v[m] = true; for (int w = 0; w<6; w++) { if (G[m][w] != M&&!d1v[w]) { cout << "(" << m + 1 << ',' << w + 1 << ")" << " "; dfs(w); } } } //广度优先搜索bfs //先把第一节点的有连接的节点都入队列,然后弹出第一节点,寻找队列第一元素,循环下去 void bfs(int m) { f[p] = m; d2v[m] = true; int g=m; while (p!=s)//当头尾指针不想等,即为非空 { for (int w = 0; w<6; w++) { if (G[g][w] != M&&!d2v[w]) { p++; f[p] = w; d2v[w] = true; cout << "(" << g+1 << ',' << w + 1 << ")" << " "; } } s++; g = f[s]; } } int main() { int y; cin>>y; dfs(y); cin>>y; bfs(y); } 图: 1.图的定义:图(Graph)G由两个集合V(vertex)和E(Edge)组成,记为G=(V,E),其中V是顶点的有限集合,记为V(G),E是连接V中两个不同顶点(顶点对)的边的有限集合,记为E(G) 无向图:G=(V,E),有向图:G= 分别表示 2.图的基本术语: 2.1)邻接点: 无向图存在边即为邻接点,有向图要互有入度出度才叫邻接点 2.2)顶点的度(D):无向图中点具有的边数即为度,有向图中以自己为起点的叫出度,以自己为终点的叫入度(入+出=总度) 边数 E = 0.5D 2.3)完全图: 两两顶点之间均存在边相连 E = n*(n-1) 2.4)稠密图和稀疏图:当接近完全图称为稠密图,当e<∈E(G) 0:其他 (3)如果G是带权无向图,则: A[j]= 权值:若i≠j且(i,j)∈E(G) 0:i=j ∞:其他 (4)如果G是带权有向图,则: A[i][j]= 权值 :若i≠j且[i]∈E(G) 0:i=j ∞:其他 4.2) 邻接矩阵的特点 1.表示唯一 2.无向图的邻接矩阵一点是对称矩阵 3.不带权的有向图的邻接矩阵一般是稀疏矩阵 4.对于无向图,i 行的非零个数是 i 的度 5.对于有向图,i 行的非零个数是 i 的出度 i 列的非零个数是 i 的入度 6.邻接矩阵可以确定顶点的连接情况,不可以确定有多少边 //最简单的定义就是一个二维数组 //如 int G[Max][Max] //通用型的定义,简单版 #define Max 10; struct MGraph { int deges[Max][Max];//邻接矩阵 int n,e;//顶点数和边数(弧数) } ; //邻接表 表示方法 struct Anode { int Ano;//边的终点信息 Anode* next;//下一边的指针 } ; struct Vnode { int Ano;//初始点 Anode* first;//第一条相接边指针 }; //然后直接定义一个一维数组 Vnode G[Max];
相关文章推荐
- 图的俩种遍历方式(DFS,BFS)C++代码实现
- 图的dfs与bfs(深搜广搜)c++实现
- 图的dfs与bfs(深搜广搜)c++实现
- 利用邻接矩阵存储无向图,并实现BFS(非递归) DFS(递归+非递归)两种遍历
- 【数据结构】C++实现整理_图的BFS与DFS(递归非递归)
- Adjacency List表示下Depth-First-Search(DFS)及Breadth-First-Search(BFS)的c++实现
- 图的dfs与bfs(深搜广搜)c++实现
- 图的邻接矩阵表示 DFS 和BFS C++实现
- 用邻接表存储有向图并实现DFS(递归+非递归)BFS(非递归)两种遍历
- 图的遍历算法实现DFS,BFS
- [数据结构]图基于邻接矩阵的BFS与DFS的C语言简单实现
- C++实现哈夫曼树简单创建与遍历的方法
- c++代码实现图的BFS遍历
- C++ 遍历目录下文件简单实现实例
- 图的遍历算法DFS和BFS(C++)
- 邻接矩阵实现图的存储,DFS,BFS遍历
- 图的遍历之BFS广度优先遍历C++实现
- C++数据结构之 --二叉树简单实现和4种遍历
- 邻接矩阵实现--图的深度优先遍历DFS和广度优先遍历BFS
- 图的BFS和DFS之C++实现