图的两种遍历:DFS&BFS

时间:2022-08-13 08:31:50

DFS和BFS在图中的应用:

图连通性判定;路径的存在性;图中是否存在环;求图的最小生成树;求图的关键路径;求图的拓扑排序。


DFS:简单的说,先一直往深处走,直到不能再深了,再从另一条路开始往深处走,直到所有路都走完;

struct node
{
int next; //E[i].next指向图中与i同父的下一个结点
int to; //E[i].to指向图中i的子结点
}E[]; int N;
int fa[]; //记录各点的父结点
bool vis[]; //记录这个点是否走过 void DFS(int u)
{
vis[u]=;
for(int i=fa[u];i!=-;i=E[i].next)
if(vis[E[i].to]==)
DFS(E[i].to); //DFS靠递归实现
}

BFS:把图看成树,先在同一层遍历各结点,再一层一层地依次往下遍历;

//用队列queue实现
bool vis[]; void BFS(int root,int N) //有N个点的图,从root点开始遍历(搜索)
{
queue<int> que;
memset(vis,,sizeof(vis));
vis[root]=;
que.push(root); int u; while(!que.empty()) //当图不是空的时候
{
u=que.front(); //将队首值赋给变量u
que.pop(); //删除队首元素 for(int i=fa[u];i!=-;i=E[i].next) //找到和u相连的所有点
if(vis[E[i].to]==)
{
vis[E[i].to]=;
que.push(E[i].to);
}
}
}