Asosiy qismga o‘tish

10. Graflar: BFS va DFS

Nazariya

Graf nima

Graf — tugunlar (vertex) va ularni bog‘lovchi qirralar (edge).
Shahar va yo‘llar, do‘stlar tarmog‘i, labirint kataklari — bularning
hammasi graf.

Tasvirlash

Qo‘shnilar ro‘yxati — eng ko‘p ishlatiladigan usul:

graf = [[] for _ in range(n + 1)]
for _ in range(m):
    u, v = map(int, input().split())
    graf[u].append(v)
    graf[v].append(u)      # yo‘naltirilmagan graf uchun

DFS — chuqurlikka

Bir yo‘nalishda oxirigacha borib, keyin qaytadi:

korilgan = [False] * (n + 1)

def dfs(u):
    korilgan[u] = True
    for v in graf[u]:
        if not korilgan[v]:
            dfs(v)

Nima uchun: bog‘langan qismlarni sanash, sikl topish, daraxtni
aylanish.

BFS — kenglikka

Qavat-qavat tarqaladi va eng qisqa yo‘lni (qirralar soni bo‘yicha)
topadi:

from collections import deque

masofa = [-1] * (n + 1)
masofa[boshlanish] = 0
navbat = deque([boshlanish])
while navbat:
    u = navbat.popleft()
    for v in graf[u]:
        if masofa[v] == -1:
            masofa[v] = masofa[u] + 1
            navbat.append(v)

deque shart: oddiy ro‘yxatda pop(0) O(n) vaqt oladi va butun
algoritm sekinlashadi.

Qaysi biri qachon

SavolUsul
Yo‘l bormiDFS yoki BFS
Eng qisqa yo‘l (qirralar bo‘yicha)BFS
Bog‘langan qismlar soniDFS yoki BFS
Sikl bormiDFS
Og‘irlikli grafda eng qisqa yo‘lDijkstra

Murakkablik

Ikkalasi ham O(n + m): har bir tugun bir marta ko‘riladi, har bir
qirra bir marta tekshiriladi.

Rekursiv DFS xavfi

Zanjir shaklidagi grafda chuqurlik n ga yetadi. n = 10⁵ bo‘lsa,
rekursiya cheklovga uriladi — u holda DFS ni ham navbat (stek) bilan,
sikl ko‘rinishida yozish kerak.

Misol

from collections import deque

masofa = [-1] * (n + 1)
masofa[1] = 0
navbat = deque([1])
while navbat:
    u = navbat.popleft()
    for v in graf[u]:
        if masofa[v] == -1:
            masofa[v] = masofa[u] + 1
            navbat.append(v)

Mashq masalalari

✓KodMasalaQiyinlik
AL10-1 Bog‘langan bo‘laklar Boshlang‘ich
AL10-2 Eng qisqa yo‘l Oson
AL10-3 Labirint O‘rta
AL10-4 Orollar O‘rta
AL10-5 Ikki jamoa Qiyin

Nazorat savollari

1 Og‘irliksiz grafda eng qisqa yo‘lni qaysi usul topadi? Bitta to‘g‘ri javob
2 BFS uchun qaysi tuzilma ishlatiladi? Bitta to‘g‘ri javob
3 Nega oddiy ro‘yxatda `pop(0)` yaramaydi? Bitta to‘g‘ri javob
4 DFS va BFS ning murakkabligi O(n + m) — tugunlar va qirralar soniga proporsional. To‘g‘ri yoki noto‘g‘ri
5 Qaysi masalalarda DFS qulay? Bir nechta to‘g‘ri javob

Bir nechta javob to‘g‘ri bo‘lishi mumkin.

6 Navbatdan element olish uchun qaysi metod ishlatiladi? Bo‘sh joyni to‘ldirish
u = navbat.____()
7 1—2, 2—3 qirralari bor. 1 dan 3 gacha masofa nechchi? Kod nima chiqaradi
# masofa[1] = 0
# masofa[2] = 1
# masofa[3] = ?
8 Yo‘naltirilmagan grafda qirra qo‘shishda nima qilinadi? Bitta to‘g‘ri javob
9 Og‘irlikli grafda eng qisqa yo‘l uchun qaysi algoritm ishlatiladi? Qisqa javob — yoziladi
10 n = 10⁵ ta tugunli zanjir shaklidagi grafda rekursiv DFS xavfsiz ishlaydi. To‘g‘ri yoki noto‘g‘ri

Javoblar serverda tekshiriladi. Katta-kichik harf, apostrof shakli va ortiqcha bo‘shliq ahamiyatsiz.