图遍历:DFS 与 BFS
全文共 16 字预计阅读 1 分钟
深度优先搜索
代码
void dfs(int u)
{
st[u] = 1; //标记当前点已经搜过
for (int i=h[u];~i;i=ne[i]) //遍历当前点的邻居
{
int j = e[i];
if (!st[j]) dfs(j); //如果没被搜过就以从这个点继续搜
}
}宽度优先搜索
代码
bool st2[N];
int q[N], hh, tt;
void bfs()
{
q[tt++] = 1; //将1号结点加入队列
st2[1] = 1; //标记已经搜过
while (hh < tt) //当队列不空
{
int t = q[hh++]; //取出头结点
cout << t << ' '; //输出路径
for (int i=h[t];~i;i=ne[i]) //搜索这个结点的邻居
{
int j = e[i];
if (!st2[j]) //如果没被搜过就加入队列,同时标记已搜过
{
q[tt++] = j;
st2[j] = 1; //一定要在入队的时候标记,防止多次入队
}
}
}
}