Breadth-First Search (BFS) adalah algoritma penelusuran graf atau tree yang bekerja dengan cara menjelajah semua node pada level (kedalaman) yang sama terlebih dahulu, baru kemudian turun ke level berikutnya.
Singkatnya: BFS menelusuri graf secara melebar, bukan mendalam.
BFS menggunakan struktur data Queue (antrian) karena prinsipnya FIFO (First In First Out).
Langkah-langkahnya:
Mulai dari node sumber (misalnya A).
Masukkan node tersebut ke dalam queue.
Ambil node dari antrian → kunjungi.
Masukkan semua tetangga node (yang belum dikunjungi) ke dalam antrian.
Ulangi hingga antrian kosong. BFS – Menjelajah secara melintang (lebar)
Mulai dari node awal → kunjungi semua tetangga terdekat dulu.
Setelah semua tetangga tingkat pertama selesai, baru lanjut ke tingkat berikutnya.
Seperti menjelajah graf layer per layer.
import java.util.*;- Mengimpor kelas utilitas Java yang dipakai:
Map,List,Queue,Set,HashMap,ArrayList,LinkedList,HashSet, dll.
private Map<String, List<String>> adj = new HashMap<>();
private Map<String, Integer> value = new HashMap<>();adj= adjacency list → menyimpan struktur graf. Kunci = nama node (mis. "a1"), nilai = daftar tetangga (neighbors).value= menyimpan nilai integer tiap node (mis. "a1" → 10). Kita akan mencari angkanpada nilai-nilai ini.
public BFS_Search() {
// set nilai node
value.put("a1", 10);
...
value.put("a8", 21);
// tambah hubungan / edge
addEdge("a1", "a2");
addEdge("a1", "a3");
addEdge("a2", "a4");
addEdge("a2", "a5");
addEdge("a3", "a6");
addEdge("a3", "a7");
addEdge("a6", "a8");
}- Di sini kita mengisi data graf: setiap node diberi nilai, lalu hubungan antar node ditentukan.
- Catatan: cara
addEdgedi program membuat arah (direction) daria→b(bukan otomatis dua arah). Jadi ini adalah directed graph kecuali jikaaddEdgedibuat menambahkan kedua arah.
private void addEdge(String a, String b) {
adj.computeIfAbsent(a, k -> new ArrayList<>()).add(b);
adj.computeIfAbsent(b, k -> new ArrayList<>()); // inisialisasi list agar key ada
}-
computeIfAbsentmemastikan ada list untuk key tersebut. -
Menambahkan
bke daftar tetanggaa. -
Baris kedua hanya memastikan
bjuga punya entry diadj(meskipun daftar tetangganya bisa kosong). -
Jika Anda ingin graf tak berarah, ubah menjadi:
adj.computeIfAbsent(a, k -> new ArrayList<>()).add(b); adj.computeIfAbsent(b, k -> new ArrayList<>()).add(a);
public List<String> bfsSearch(String start, int target) {
Queue<String> queue = new LinkedList<>();
Set<String> visited = new HashSet<>();
Map<String, String> parent = new HashMap<>();
queue.add(start);
visited.add(start);
parent.put(start, null);
while (!queue.isEmpty()) {
String node = queue.poll();
if (value.get(node) == target) {
return buildPath(parent, node);
}
for (String neighbor : adj.get(node)) {
if (!visited.contains(neighbor)) {
visited.add(neighbor);
parent.put(neighbor, node);
queue.add(neighbor);
}
}
}
return null;
}Langkah rinci:
-
Inisialisasi:
queuemenyimpan node yang akan dikunjungi (FIFO).visitedmencegah pengulangan kunjungan node yang sama.parentmenyimpan jejak (parent mapping) untuk membangun kembali jalur saat target ditemukan.
-
Masukkan node awal (
start) kequeuedan tandaivisited. -
Loop utama: selama
queuetidak kosong:-
poll()ambil node paling depan (level paling dekat dari start). -
Cek nilai node (
value.get(node)) apakah samatarget.- Jika sama → panggil
buildPath(parent, node)untuk membentuk jalur daristartke node itu dan kembalikan.
- Jika sama → panggil
-
Telusuri tetangga: untuk setiap
neighbordarinode:- Jika belum dikunjungi → tandai
visited, catatparent(agar bisa membangun jalur), danenqueueneighbor.
- Jika belum dikunjungi → tandai
-
-
Jika selesai loop tanpa menemukan target → kembalikan
null(tidak ditemukan).
private List<String> buildPath(Map<String, String> parent, String node) {
List<String> path = new ArrayList<>();
while (node != null) {
path.add(node);
node = parent.get(node);
}
Collections.reverse(path);
return path;
}- Mulai dari node tujuan, iterasi ke belakang lewat
parenthingga mencapainull(node awal). - Hasilnya dibalik supaya urutan dari
start→target.
public static void main(String[] args) {
BFS_Search g = new BFS_Search();
Scanner sc = new Scanner(System.in);
System.out.print("Masukkan nilai yang dicari (n): ");
int n = sc.nextInt();
System.out.println("\n=== BFS Search (mulai dari a1) ===");
List<String> path = g.bfsSearch("a1", n);
if (path != null) {
System.out.println("Nilai ditemukan pada node: " + path.get(path.size() - 1));
System.out.println("Jalur BFS menuju node tersebut: " + path);
} else {
System.out.println("Nilai tidak ditemukan dalam graf.");
}
sc.close();
}- Program membuat instance graf, meminta input
ndari user, lalu memanggilbfsSearchdimulai dari"a1". - Menampilkan hasil: node tempat nilai ditemukan dan jalurnya, atau pesan tidak ditemukan.
- Menutup
Scannerdengansc.close().
- Start =
a1(enqueuea1) - Keluarkan
a1→ cek nilai (10 ≠ 21) → enqueue tetanggaa2,a3 - Keluarkan
a2→ cek nilai (5 ≠ 21) → enqueuea4,a5 - Keluarkan
a3→ cek nilai (17 ≠ 21) → enqueuea6,a7 - Keluarkan
a4→ ... seterusnya - Pada akhirnya saat
a8di-dequeue nilai = 21 → build path lewat parent →[a1, a3, a6, a8]
- Waktu: O(V + E) — setiap node dan setiap edge diproses maksimal sekali.
- Memori: O(V) untuk
visited,parent, dan sebagianqueue.
-
NullPointerException: jika
adj.get(node)mengembalikannull. Program saat ini berusaha mencegahnya dengancomputeIfAbsentpadaaddEdge, tapi pastikanstartjuga ada diadj. Jika ingin aman, ganti loop menjadi:List<String> neighbors = adj.getOrDefault(node, new ArrayList<>()); for (String neighbor : neighbors) { ... }
-
value.get(node): pastikan semua node di
adjjuga punyavalue(atau cek null sebelum dibandingkan). -
Graf berarah vs tak berarah: sesuaikan
addEdgejika perlu hubungan dua arah. -
Multiple nodes with same value: program berhenti pada penemuan pertama (level terpendek dari start). Jika Anda ingin semua node yang memiliki nilai
n, kumpulkan semua ketika ditemukan (jangan return langsung). -
File VS Code warning: sebelumnya Anda lihat peringatan “non-project file” — itu tidak menghalangi compile via terminal. Untuk fitur penuh di VS Code, buka folder proyek Java (lihat solusi sebelumnya).
- Kembalikan juga urutan kunjungan (visited order) untuk debugging.
- Buat
bfsSearchmengembalikan objek hasil yang memuat:found(boolean),path,visitedOrder. - Tambahkan input graf dinamis (baca edges dan values dari file atau input user).
- Implementasi BFS untuk graf tak berarah (jika diperlukan).
- Menangani graf besar: gunakan array/indeks numeric untuk efisiensi jika node bernama a1..a8.