c++中图的遍历,dfs和bfs的简单实现

来源:互联网 发布:通信网络优化值得做吗 编辑:程序博客网 时间:2024/06/05 08:08

下面是代码实现部分,感兴趣再在下面看相关知识//代码实现部分 #include using namespace std;#define M 100000int 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 };//标志数组,dfsbool 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.5D2.3)完全图: 两两顶点之间均存在边相连 E = n*(n-1)2.4)稠密图和稀疏图:当接近完全图称为稠密图,当e<∈E(G)  0:其他 (3)如果G是带权无向图,则:      A[i][j]= 权值:若i≠j且(i,j)∈E(G)    0:i=j    ∞:其他 (4)如果G是带权有向图,则:      A[i][j]=  权值 :若i≠j且∈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];

原创粉丝点击