1. 程式人生 > 其它 >圖的BFS與DFS

圖的BFS與DFS

前言

本部分程式碼的存圖方式為 \(\text{vector}\) 存圖。

它與標準鄰接表差別並不是很大。只是 \(\text{vector}\) 比較好寫。

例題

題目連結

題目給我們一個有向圖,要求我們求出從一個入度為 \(0\) 的點開始,DFS 和 BFS 的遍歷順序。

請對這個圖分別進行 DFS 和 BFS,並輸出遍歷結果。如果有很多點可以遍歷,請先遍歷編號較小的那個點 (因此你可能需要先排序)。

輸入樣例

8 9
1 2
1 3
1 4
2 5
2 6
3 7
4 7
4 8
7 8

輸出樣例

1 2 5 6 3 7 8 4 
1 2 3 4 5 6 7 8 

DFS

直接感性理解,深搜即可。無任何難度。

void dfs(ll s)
{
    vis[s] = 1;
    ans.push_back(s);
    for (int i = 0; i < t[s].size(); ++i)
        if (!vis[t[s][i]])
            dfs(t[s][i]);
}

BFS

關於如何廣搜,這裡我就不再講解。具體可以檢視大佬部落格

這裡只放程式碼作為參考。

void bfs(ll s)
{
    queue<ll> q;
    q.push(s);
    vis[s] = 1;
    while (!q.empty())
    {
        ll x = q.front();
        ans.push_back(x);
        q.pop();
        for (ll i = 0; i < t[x].size(); ++i)
        {
            if (!vis[t[x][i]])
            {
                q.push(t[x][i]);
                vis[t[x][i]] = 1;
            }
        }
    }
}