Junie's Blog

图遍历: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; //一定要在入队的时候标记,防止多次入队
            }
        }
    }
}

评论