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

下面是代码实现部分,感兴趣再在下面看相关知识

//代码实现部分 
#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[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]; 

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