BFS dan DFS

Breadth-First Search (BFS): BFS merupakan algoritma yang mengtransversal pada graf yang memilih node terdekat terlebih dahulu.

Depth-First Search (DFS): DFS merupakan algoritma yang mengtransversal pada graf yang memilih anak node terlebih dahulu.

Persoalan: Diberfikan graf berarah dan sebuan simpul (vertex) S, tentukan banyak sisi (edge) terdikit yang harus dilalui dari S ke semua simpul pada graf.

Solusi:

vector<int> adj[MAXN]; /* adjecency list dari graf */
int dist[MAXN];

int dfs(int node){
    for(int next_node : adj[node]){
        if(dist[next_node]==-1){
            dist[next_node] = dist[node]+1;
            dfs(next_node);
        }
    }
}

int main(){
    int start;
    dist[start] = 0;
    dfs(start);
}

Implementasi diatas tidak menghasilkan jawaban yang minimal. Untuk dapat mendepatkan jawaban optimal menggunakan dfs, kompleksitas waktu akan eksponensial.

Hal ini dapat diselesaikan dengan optimal secara linear dengan menggunakan algoritma Breadth-First Search.

vector<int> adj[MAXN]; /* adjecency list dari graf */
int dist[MAXN];
/* dist di set dengan -1 untuk membedakan apakah node i sudah pernah dilewati atau belum dengan jarak terdekat */
memset(dist, -1, sizeof dist);
int start;
queue<int> q;
q.push(start);
dist[start] = 0;
while(!q.empty()){
    int now = q.front();
    q.pop();
    for(int next_node : adj[node]){
        if(dist[next_node]==-1){
            dist[next_node] = dist[now]+1;
            q.push(next_node);
        }
    }
}
/*
    dist[i] = jarak terdekat dari start ke i, jika dist[i] != -1
*/