Modul 3 (Graph Traversal) - Algoritma-dan-Pemrograman-ITS/StrukturData GitHub Wiki

Traversal Graf

Depth First Search (DFS)

Sesuai dengan namanya, DFS akan melakukan traversal sampai ke vertex yang paling 'dalam'. Setiap kali sampai di suatu vertex $u$, DFS akan memilih salah satu vertex yang terhubung dengan vertex $u$ dan belum pernah dikunjungi sebelumnya, lalu melanjutkan penelusuran dari vertex tersebut. Langkah ini terus dilakukan selama kita masih menemukan vertex yang masih bisa dikunjungi. Jika sudah tidak ada, akan dilakukan backtracking lalu kembali mencari vertex yang bisa dikunjungi.
Contoh pengimplementasian dalam weighted graf dapat dilakukan secara iteratif seperti kode berikut:

void dfs(vector<long> &result, long start){
    vector<bool> visited(vertex, false);
    stack<long> st;

    st.push(start);
    visited[start] = true;
    result.push_back(start);

    while(!st.empty()){
        long temp = st.top();
        st.pop();

        if(!visited[temp]){
            result.push_back(temp);
            visited[temp] = true;
        }

        for(auto it:adjList[temp]){
            if (!visited[it.first])
                st.push(it.first);
        }
    }
}

Pseudocode DFS

Pseudocode DFS

Ilustrasi DFS

Ilustrasi DFS

Source: https://skilled.dev/course/depth-first-search

Breadth First Search (BFS)

Traversal menggunakan BFS dimulai dari sebuah vertex, lalu akan mengunjungi vertex yang terhubung langsung dengan vertex tersebut (layer 1). Lalu, di langkah selanjutnya akan mengunjungi vertex yang terhubung langsung dengan vertex - vertex pada layer 1 (layer 2) dan seterusnya sampai sudah tidak ada lagi vertex yang bisa dikunjungi.
Berbeda dengan DFS, pengimplementasian BFS dapat dilakukan secara iteratif dengan menggunakan bantuan queue seperti berikut :

void bfs(vector<long> &result, long start){
    vector<bool> visited(vertex, false);
    queue<long> q;

    q.push(start);
    visited[start] = true;
    result.push_back(start);

    while(!q.empty()){
        long temp = q.front();
        q.pop();

        for(auto it:adjList[temp]){
            if (!visited[it.first]){
                q.push(it.first);
                visited[it.first] = true;
                result.push_back(it.first);
            }
        }
    }
}

Pseudocode BFS

Pseudocode BFS

Ilustrasi BFS

Ilustrasi BFS

Source: https://skilled.dev/course/breadth-first-search

Trivia question : pada DFS, kita melakukan penandaan pada node sebelum mengiterasi isi dari adjacency list, sedangkan pada BFS, kita melakukan penandaan di dalam iterasi. Apakah timing penempatan tanda ini berpengaruh pada algoritma-algoritma tersebut? Jika iya, apa pengaruhnya?

Graph

Jika kita melakukan BFS pada graf tersebut dari vertex 1, maka vertex-vertex tiap layer adalah:

  • Layer 0 : 1
  • Layer 1 : 2 5
  • Layer 2 : 3 4
  • Layer 3 : 6

Perhatikan bahwa jumlah layer adalah jumlah dari edge minimal yang harus dilewati untuk sampai ke vertex tersebut dari vertex 1 atau biasa disebut dengan shortest path.

⚠️ **GitHub.com Fallback** ⚠️