Previous slide Next slide Toggle fullscreen Open presenter view
CEN207 Veri Yapıları · Hafta 9
Hafta 9
Çizge Algoritmaları
Sıralama · Ağırlıklar · Döngüler · Geri İzleme
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Bugünün haritası
Sıralama: topolojik sıralama (2 yöntem), döngü tespiti
Grupları takip et: union-find (ayrık küme)
En ucuz bağlantılar: Kruskal, Prim (MST)
En ucuz yollar: Dijkstra, Bellman-Ford, Floyd-Warshall
Erişilebilirlik: güçlü bağlı bileşenler, iki parçalılık
Yolların ötesi: en büyük akış, geri izleme
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Başlamadan önce: bildikleriniz
Hafta 5: komşuluk listesi, alfabetik komşular
BFS: kuyruk, en az kenar sayısı
DFS: özyineleme veya açık yığın
Bağlı bileşenler: her ziyaret edilmemiş köşeden BFS/DFS
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Tek yeni bileşen: ağırlıklar
Bugünün algoritmalarından 6'sı her kenara bir sayı iliştirir
Bir mesafe, bir maliyet, bir kapasite
Soru "ulaşılabilir mi?"den **"en ucuzu hangisi?"**ye değişir
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Bu hafta Hafta 5'ten ne kullanıyor
Hafta 5 aracı
Kullanan
Komşuluk listesi, alfabetik sıra
Bu haftaki her algoritma
BFS kuyruğu
İki parçalılık kontrolü, en büyük akışın genişletme yolu
DFS özyinelemesi
Topolojik sıralama, döngü tespiti, GBB, geri izleme
Çember yerleşimi
Her animasyonun çizge çizimi
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
1. Topolojik Sıralama
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Başlangıç sorusu
Çoraplar ayakkabılardan önce. Gömlek ceketten önce.
Çorap ile gömlek arasında bir sıra yok.
Her kuralı gözeten tek bir sıra her zaman var mıdır?
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Kısa tarihçe
A. B. Kahn , 1962 — içe-derece (in-degree) + kuyruk
Build sistemleri, paket kurulumcuları bunu her gün kullanır
DFS tabanlı alternatif, Tarjan 'ın 1970'lerdeki DFS çerçevesinden çıkar
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Kahn'ın fikri
İçe-derecesi 0 olan bir köşenin karşılanmamış ön koşulu yoktur
Onu şimdi yerleştir; bu, giden kenarlarını kaldırır
Her komşunun içe-derecesi bir azalır
Yeni sıfırlanan komşular uygun hale gelir — onları kuyruğa al
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Kahn'ın kodu (C) — bölüm 1/2
int topo_sort_kahn (Graph *g) {
for (int i=0 ;i<g->vertex_count;i++) indeg[i]=0 ;
for (int u=0 ;u<g->vertex_count;u++)
for (AdjNode *n=g->adj[u]; n; n=n->next)
indeg[n->to]++;
front=rear=0 ; order_len=0 ;
for (int v=0 ;v<g->vertex_count;v++)
if (indeg[v]==0 ) enqueue(v);
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Kahn'ın kodu (C) — bölüm 2/2
while (front<rear) {
int u=dequeue();
order[order_len++]=u;
for (AdjNode *n=g->adj[u]; n; n=n->next) {
indeg[n->to]--;
if (indeg[n->to]==0 ) enqueue(n->to);
}
}
return order_len==g->vertex_count;
}
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Kahn'ın kodu (Java) — bölüm 1/2
static boolean topoSortKahn (Graph g) {
for (int i=0 ;i<g.vertexCount;i++) indeg[i]=0 ;
for (int u=0 ;u<g.vertexCount;u++)
for (AdjNode n=g.adj[u]; n!=null ; n=n.next)
indeg[n.to]++;
front=rear=0 ; orderLen=0 ;
for (int v=0 ;v<g.vertexCount;v++)
if (indeg[v]==0 ) enqueue(v);
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Kahn'ın kodu (Java) — bölüm 2/2
while (front<rear) {
int u=dequeue();
order[orderLen]=u; orderLen++;
for (AdjNode n=g.adj[u]; n!=null ; n=n.next) {
indeg[n.to]--;
if (indeg[n.to]==0 ) enqueue(n.to);
}
}
return orderLen==g.vertexCount;
}
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Kahn'ın algoritması
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Uç durum: bir döngü
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Gerçek çıktı: Kahn'ın algoritması
-- normal: 8 vertices, 10 edges, a valid DAG --
order: A B C D F E G H
all 8 vertices placed: a valid topological order
-- edge: 10 edges but a cycle exists, no full order --
order:
only 0 of 7 vertices placed -- a cycle exists
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
DFS fikri
Özyinelemeli DFS çalıştır (Hafta 5'in DFS'i, bir dizi eklenmiş)
Her köşenin bitiş zamanını kaydet
Bitiş zamanlarını büyükten küçüğe oku
Bir köşe, işaret ettiği her şeyden sonra biter
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
DFS topolojik sıralama kodu (C) — dfs_visit
void dfs_visit (int u) {
color_of[u]=1 ;
for (AdjNode *n=cur_g->adj[u]; n; n=n->next) {
if (color_of[n->to]==0 ) dfs_visit(n->to);
else if (color_of[n->to]==1 ) has_cycle=1 ;
}
color_of[u]=2 ;
finish[finish_len++]=u;
}
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
DFS topolojik sıralama kodu (C) — sürücü
void topo_sort_dfs (Graph *g) {
cur_g=g;
for (int i=0 ;i<g->vertex_count;i++) color_of[i]=0 ;
finish_len=0 ; has_cycle=0 ;
for (int v=0 ;v<g->vertex_count;v++)
if (color_of[v]==0 ) dfs_visit(v);
}
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
DFS topolojik sıralama kodu (Java) — dfsVisit
static void dfsVisit (int u) {
colorOf[u]=1 ;
for (AdjNode n=curG.adj[u]; n!=null ; n=n.next) {
if (colorOf[n.to]==0 ) dfsVisit(n.to);
else if (colorOf[n.to]==1 ) hasCycle=true ;
}
colorOf[u]=2 ;
finish[finishLen]=u; finishLen++;
}
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
DFS topolojik sıralama kodu (Java) — sürücü
static void topoSortDfs (Graph g) {
curG=g;
for (int i=0 ;i<g.vertexCount;i++) colorOf[i]=0 ;
finishLen=0 ; hasCycle=false ;
for (int v=0 ;v<g.vertexCount;v++)
if (colorOf[v]==0 ) dfsVisit(v);
}
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
DFS topolojik sıralama
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Karmaşıklık ve tuzak
O(V + E) — her iki algoritma da, tek geçiş
Tuzak: bir topolojik sıra tek değildir
Konumları karşılaştırın, kesin diziyi asla sabit kodlamayın
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Kısa soru
Kahn'ın algoritması neden tek bir özyinelemeli çağrı değil de bir kuyruk kullanır?
(cevap bir sonraki slaytta)
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Cevap
Bir DAG'ın aynı anda birden fazla bağımsız kaynağı olabilir.
Kuyruk, algoritmanın bir dalı bitirmeden diğerine başlamak yerine, tek geçişte onları iç içe geçirmesini sağlar.
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
2. Döngü Tespiti (Yönlü)
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Başlangıç sorusu
Bölüm 1'in DFS'i bir döngünün var olduğunu tespit eder (bir geri kenar).
Hangi köşeler , hangi sırayla onu oluşturuyor?
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Yollu 3 renkli DFS
Beyaz / gri (yol üzerinde) / siyah (bitmiş)
Güncel yolu on_path[] içinde tut
Gri bir köşeye giden bir geri kenar: o köşe açık bir atadır
Oradan buraya kadarki yol dilimi döngünün kendisidir
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Döngü tespiti kodu (C) — bölüm 1/2
int dfs_cycle (int u) {
color_of[u]=1 ;
on_path[path_top++]=u;
for (AdjNode *n=cur_g->adj[u]; n; n=n->next) {
if (color_of[n->to]==0 ) {
if (dfs_cycle(n->to)) return 1 ;
} else if (color_of[n->to]==1 ) {
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Döngü tespiti kodu (C) — bölüm 2/2
int i=path_top-1 ;
while (on_path[i]!=n->to) i--;
cycle_len=0 ;
for (; i<path_top; i++)
cycle[cycle_len++]=on_path[i];
return 1 ;
}
}
path_top--; color_of[u]=2 ;
return 0 ;
}
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Döngü tespiti kodu (Java) — bölüm 1/2
static boolean dfsCycle (int u) {
colorOf[u]=1 ;
onPath[pathTop]=u; pathTop++;
for (AdjNode n=curG.adj[u]; n!=null ; n=n.next) {
if (colorOf[n.to]==0 ) {
if (dfsCycle(n.to)) return true ;
} else if (colorOf[n.to]==1 ) {
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Döngü tespiti kodu (Java) — bölüm 2/2
int i=pathTop-1 ;
while (onPath[i]!=n.to) i--;
cycleLen=0 ;
for (; i<pathTop; i++) {
cycle[cycleLen]=onPath[i]; cycleLen++;
}
return true ;
}
}
pathTop--; colorOf[u]=2 ;
return false ;
}
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Yönlü çizgede döngü tespiti
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Uç durum: hiç döngü yok
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Gerçek çıktı: döngü tespiti
-- normal: 8 vertices, 10 edges, one cycle: C-D-F-C --
cycle found: D F C -> D
-- edge: 10 edges, entirely cycle-free (a DAG) --
no cycle found
-- edge: the smallest cycle, A-B-A (2 edges) --
cycle found: A B -> A
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Karmaşıklık ve tuzak
O(V + E) — bir DFS, artı bulunan döngüyü çıkarmak için O(V)
Tuzak: "gri " yerine "beyaz değil" kontrolü yapmak
Siyah bir komşu bitmiştir ve güvenlidir — döngü değildir
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Kısa soru
Bölüm 1'in DFS topolojik sıralaması sadece has_cycle = 1 yapıyor. Bu algoritma neden ekstra bir on_path[] yığınına ihtiyaç duyuyor?
(cevap bir sonraki slaytta)
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Cevap
Bir döngünün var olduğunu bilmek, onu hangi köşelerin oluşturduğunu bilmekle aynı değildir.
on_path[], güncel kök-buraya zincirini erişilebilir tutar; böylece bir geri kenar bulunduğu anda döngü doğrudan ondan okunabilir.
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
3. Union-Find (Ayrık Küme)
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Başlangıç sorusu
Kruskal'ın algoritması (birazdan geliyor) tekrar tekrar şunu sormalı:
"Bu iki köşe, seçtiğim kenarlarla zaten bağlı mı?"
Her seferinde taze bir BFS doğru olur — ama yavaş olur.
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Ebeveyn işaretçilerinden bir orman
find(v), ebeveyn işaretçilerinde köke kadar yürür
Aynı kök = aynı grup
union(a, b), iki grubu birleştirir: kök köke işaret eder
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
İki hile
Ranka göre birleştirme : kısa ağaç, uzun olanın altına asılır
Yol sıkıştırma : find, ziyaret ettiği her köşeyi doğrudan köke yeniden bağlar
Birlikte: işlem başına O(α(n)) — pratikteki her n için bu O(1)'dir
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Union-find kodu (C) — find
int find (int v) {
int root=v;
while (parent_of[root]!=root) root=parent_of[root];
while (parent_of[v]!=root) {
int next=parent_of[v];
parent_of[v]=root;
v=next;
}
return root;
}
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Union-find kodu (C) — union_sets
void union_sets (int a, int b) {
int ra=find(a), rb=find(b);
if (ra==rb) return ;
if (rank_of[ra]<rank_of[rb]) parent_of[ra]=rb;
else if (rank_of[ra]>rank_of[rb]) parent_of[rb]=ra;
else { parent_of[rb]=ra; rank_of[ra]++; }
}
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Union-find kodu (Java) — find
static int find (int v) {
int root=v;
while (parentOf[root]!=root) root=parentOf[root];
while (parentOf[v]!=root) {
int next=parentOf[v];
parentOf[v]=root;
v=next;
}
return root;
}
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Union-find kodu (Java) — unionSets
static void unionSets (int a, int b) {
int ra=find(a), rb=find(b);
if (ra==rb) return ;
if (rankOf[ra]<rankOf[rb]) parentOf[ra]=rb;
else if (rankOf[ra]>rankOf[rb]) parentOf[rb]=ra;
else { parentOf[rb]=ra; rankOf[ra]++; }
}
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Gerçek çıktı: union-find
union(A, B): merged, new root = A
union(C, D): merged, new root = C
union(A, C): merged, new root = A
find(D) = A
union(B, H): already the same set (A)
final sets: A->A B->A C->A D->A E->A F->A G->A H->A
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Union-find: rank + yol sıkıştırma
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Karmaşıklık ve tuzak
Her iki hile ile birlikte işlem başına ~O(1) amortize
Tuzak: union(a, b)'nin a, b'yi doğrudan karşılaştırması
Kökler birleştirilmeli — find(a), find(b) — asla ham argümanlar değil
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Kısa soru
Rank, bir kümedeki eleman sayısını değil, yüksekliği sayar. Neden doğrudan küme boyutu takip edilmiyor?
(cevap bir sonraki slaytta)
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Cevap
Boyut da işe yarar ve yaygın bir alternatiftir — "boyuta göre birleştirme" küçük kümeyi büyüğün altına asar.
İkisi de aynı O(α(n)) garantisini verir; rank, ağaç yüksekliğini doğrudan sınırladığı için klasik sunumdur — find'ın gerçekten bedelini ödediği şey de budur.
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
4. En Küçük Yayılan Ağaçlar
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Başlangıç sorusu
n kasabayı elektrik hatlarıyla bağlayın. Herhangi bir çift doğrudan bir maliyetle bağlanabilir.
Her şeyi hâlâ bağlayan en ucuz hat kümesi nedir?
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Kısa tarihçe
Joseph Kruskal , 1956
Robert Prim , 1957 (Jarník'i, 1930, yeniden keşfederek)
Aynı problem, yapısal olarak farklı iki açgözlü çözüm
İkisi de kanıtlanabilir şekilde güvenli: kesme özelliği (cut property)
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Kruskal'ın fikri
Tüm kenarları ağırlığa göre sırala, bir kez
En ucuzdan başlayarak tara; bir döngü kapatmadıkça kenarı ekle
Döngü kontrolü: union-find, neredeyse O(1)
Bağlı olmayan çizge → bir yayılan orman
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Prim'in fikri
Bir başlangıç köşesinden tek bir ağaç büyüt
İçeriden dışarıya en ucuz kenarı ekle
key[v] = v'yi ağaca şimdiye kadar bağlayan en ucuz kenar
Farklı bir bileşene hiç ulaşmaz: key "sonsuz" kalır
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Kruskal'ın kodu (C) — bölüm 1/2
int kruskal_mst (Edge *sorted, int edge_count,
Edge *mst_out, int *total_out) {
for (int v=0 ;v<vertex_count;v++)
{ parent_of[v]=v; rank_of[v]=0 ; }
qsort(sorted, edge_count, sizeof (Edge), cmp_weight);
int mst_len=0 , total=0 ;
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Kruskal'ın kodu (C) — bölüm 2/2
for (int i=0 ;i<edge_count;i++) {
if (find(sorted[i].a)==find(sorted[i].b))
continue ;
union_sets(sorted[i].a, sorted[i].b);
mst_out[mst_len++]=sorted[i];
total+=sorted[i].w;
}
*total_out=total;
return mst_len;
}
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Kruskal'ın kodu (Java) — bölüm 1/2
static int kruskalMst (Edge[] sorted,
Edge[] mstOut, int [] totalOut) {
for (int v=0 ;v<vertexCount;v++)
{ parentOf[v]=v; rankOf[v]=0 ; }
Arrays.sort(sorted, Comparator.comparingInt(
(Edge e) -> e.w).thenComparingInt(e -> e.idx));
int mstLen=0 , total=0 ;
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Kruskal'ın kodu (Java) — bölüm 2/2
for (Edge e : sorted) {
if (find(e.a)==find(e.b)) continue ;
unionSets(e.a, e.b);
mstOut[mstLen]=e; mstLen++;
total+=e.w;
}
totalOut[0 ]=total;
return mstLen;
}
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Kruskal'ın MST'si
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Uç durum: yayılan bir orman
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Gerçek çıktı: Kruskal'ın MST'si
-- normal: 7 vertices, 10 edges, one component --
MST edges: B-C:1 A-C:2 D-E:2 E-F:3 B-D:5 E-G:7
total weight = 20
components = 1
-- edge: 10 edges, 2 components -- a spanning FOREST --
MST edges: C-D:1 A-B:2 F-G:2 D-E:3 H-I:3 B-C:4 I-J:4 G-H:6
total weight = 25
components = 2 (a spanning forest)
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Prim'in kodu (C) — bölüm 1/2
int prim_mst (Graph *g, int start,
Edge *mst_out, int *total_out) {
for (int v=0 ;v<g->vertex_count;v++)
{ key_of[v]=INF; in_mst[v]=0 ; parent_of[v]=-1 ; }
key_of[start]=0 ;
int mst_len=0 , total=0 ;
for (int count=0 ;count<g->vertex_count;count++) {
int u=min_key_vertex(g->vertex_count);
if (u==-1 || key_of[u]==INF) break ;
in_mst[u]=1 ;
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Prim'in kodu (C) — bölüm 2/2
if (parent_of[u]!=-1 ) {
mst_out[mst_len].a=parent_of[u];
mst_out[mst_len].b=u;
mst_out[mst_len].w=key_of[u];
mst_len++; total+=key_of[u];
}
for (AdjNode *n=g->adj[u]; n; n=n->next)
if (!in_mst[n->to] && n->weight<key_of[n->to])
{ key_of[n->to]=n->weight;
parent_of[n->to]=u; }
}
*total_out=total;
return mst_len;
}
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Prim'in kodu (Java) — bölüm 1/2
static int primMst (Graph g, int start,
Edge[] mstOut, int [] totalOut) {
for (int v=0 ;v<g.vertexCount;v++)
{ keyOf[v]=INF; inMst[v]=false ; parentOf[v]=-1 ; }
keyOf[start]=0 ;
int mstLen=0 , total=0 ;
for (int count=0 ;count<g.vertexCount;count++) {
int u=minKeyVertex(g.vertexCount);
if (u==-1 || keyOf[u]==INF) break ;
inMst[u]=true ;
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Prim'in kodu (Java) — bölüm 2/2
if (parentOf[u]!=-1 ) {
mstOut[mstLen]=new Edge ();
mstOut[mstLen].a=parentOf[u];
mstOut[mstLen].b=u;
mstOut[mstLen].w=keyOf[u];
mstLen++; total+=keyOf[u];
}
for (AdjNode n=g.adj[u]; n!=null ; n=n.next)
if (!inMst[n.to] && n.weight<keyOf[n.to])
{ keyOf[n.to]=n.weight; parentOf[n.to]=u; }
}
totalOut[0 ]=total;
return mstLen;
}
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Prim'in MST'si
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Gerçek çıktı: Prim'in MST'si
-- normal: 7 vertices, 10 edges, starts at A --
MST edges: A-C:2 C-B:1 B-D:5 D-E:2 E-F:3 E-G:7
total weight = 20
-- edge: 2 components, starts at A -- F..J never reached --
MST edges: A-B:2 B-C:4 C-D:1 D-E:3
total weight = 10
unreached: F G H I J
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Karmaşıklık tablosu
Algoritma
Süre
Not
Kruskal
O(E log E)
sıralama baskın
Prim (dizi)
O(V^2)
Dijkstra'nın şekliyle eşleşir
Prim (yığın)
O(E log V)
yoğun çizgelerde daha iyi
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Kısa soru
Prim, aynı çizgede Kruskal'dan daha pahalı bir kenar seçebilir mi?
(cevap: hayır — bir sonraki slayta bakın)
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Cevap
Hayır. İkisi de kanıtlanabilir şekilde en iyisidir (kesme özelliği).
Bir çizgenin her MST'si aynı toplam ağırlığa sahiptir — ağırlıklar eşitlendiğinde sadece hangi kenarları seçtikleri farklılaşabilir.
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
5. Tek Kaynaktan En Kısa Yollar
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Başlangıç sorusu
Mesafeye göre ağırlıklandırılmış bir yol ağı. Bir şehirden başlayarak,
her diğer şehre en ucuz ulaşım nasıl olur?
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Kısa tarihçe
Edsger Dijkstra , 1956 (1959'da yayımlandı)
Yeni bir bilgisayarı tanıtmak için 20 dakikalık bir alıştırma
Her ağırlık negatif olmadığında hâlâ standart cevap
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Dijkstra'nın fikri
dist[v] = şimdiye kadar bulunan en ucuz toplam yol
Henüz bitmemiş, dist değeri en küçük köşeyi seç
Seçildiğinde: kesin , bir daha asla küçülemez
Bu sadece hiçbir kenar ağırlığı negatif olmadığı için doğru
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Negatif ağırlıklar neden bozar
Erken "kesin" olarak çıkarılan bir köşe, daha sonra çok negatif bir kenardan geçen bir yolla yenilebilir — bu, köşe zaten kesinleştikten sonra keşfedilir.
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Dijkstra'nın kodu (C) — bölüm 1/2
void dijkstra (Graph *g, int start) {
for (int v=0 ;v<g->vertex_count;v++)
{ dist_of[v]=INF; done[v]=0 ; parent_of[v]=-1 ; }
dist_of[start]=0 ;
for (int count=0 ;count<g->vertex_count;count++) {
int u=min_dist_vertex(g->vertex_count);
if (u==-1 || dist_of[u]==INF) break ;
done[u]=1 ;
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Dijkstra'nın kodu (C) — bölüm 2/2
for (AdjNode *n=g->adj[u]; n; n=n->next) {
int cand=dist_of[u]+n->weight;
if (!done[n->to] && cand<dist_of[n->to])
{ dist_of[n->to]=cand; parent_of[n->to]=u; }
}
}
}
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Dijkstra'nın kodu (Java) — bölüm 1/2
static void dijkstra (Graph g, int start) {
for (int v=0 ;v<g.vertexCount;v++)
{ distOf[v]=INF; done[v]=false ; parentOf[v]=-1 ; }
distOf[start]=0 ;
for (int count=0 ;count<g.vertexCount;count++) {
int u=minDistVertex(g.vertexCount);
if (u==-1 || distOf[u]==INF) break ;
done[u]=true ;
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Dijkstra'nın kodu (Java) — bölüm 2/2
for (AdjNode n=g.adj[u]; n!=null ; n=n.next) {
int cand=distOf[u]+n.weight;
if (!done[n.to] && cand<distOf[n.to])
{ distOf[n.to]=cand; parentOf[n.to]=u; }
}
}
}
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Dijkstra en kısa yol
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Gerçek çıktı: Dijkstra
-- normal: 8 vertices, 10 edges, starts at A --
distances: A=0 B=3 C=2 D=8 E=10 F=13 G=17
-- edge: F..J never reachable via the directed edges --
distances: A=0 B=2 C=5 D=6 E=9 F=inf G=inf H=inf I=inf J=inf
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Bellman-Ford: negatif ağırlıklar sorun değil
Bellman ve Ford , 1950'lerin sonu
"En küçüğü çıkar" fikrinden tamamen vazgeç
Her kenarı, sabit sırayla, V - 1 tura kadar gevşet
Hâlâ iyileştiren bir V. tur = bir negatif döngü
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Bellman-Ford'un kodu (C) — bölüm 1/2
int bellman_ford (Graph *g, int start) {
for (int v=0 ;v<g->vertex_count;v++)
{ dist_of[v]=INF; parent_of[v]=-1 ; }
dist_of[start]=0 ;
for (int p=1 ;p<=g->vertex_count-1 ;p++) {
int changed=0 ;
for (int u=0 ;u<g->vertex_count;u++) {
if (dist_of[u]==INF) continue ;
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Bellman-Ford'un kodu (C) — bölüm 2/2
for (AdjNode *n=g->adj[u]; n; n=n->next) {
int cand=dist_of[u]+n->weight;
if (cand<dist_of[n->to])
{ dist_of[n->to]=cand;
parent_of[n->to]=u; changed=1 ; }
}
}
if (!changed) break ;
}
}
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Bellman-Ford'un kodu (Java) — bölüm 1/2
static boolean bellmanFord (Graph g, int start) {
for (int v=0 ;v<g.vertexCount;v++)
{ distOf[v]=INF; parentOf[v]=-1 ; }
distOf[start]=0 ;
for (int pass=1 ;pass<=g.vertexCount-1 ;pass++) {
boolean changed=false ;
for (int u=0 ;u<g.vertexCount;u++) {
if (distOf[u]==INF) continue ;
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Bellman-Ford'un kodu (Java) — bölüm 2/2
for (AdjNode n=g.adj[u]; n!=null ; n=n.next) {
int cand=distOf[u]+n.weight;
if (cand<distOf[n.to])
{ distOf[n.to]=cand;
parentOf[n.to]=u; changed=true ; }
}
}
if (!changed) break ;
}
}
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Bellman-Ford en kısa yol
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Zorunlu uç durum: negatif döngü
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Gerçek çıktı: Bellman-Ford
-- normal: 7 vertices, all positive, starts at A --
distances: A=0 B=3 C=2 D=8 E=10 F=13 G=17
no negative cycle
-- edge: A-B-C-A is a negative cycle (total -1) --
distances: A=-4 B=-2 C=0 D=0 E=1
negative cycle detected
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Karmaşıklık tablosu
Algoritma
Süre
Negatifleri kaldırır mı?
Dijkstra
O(V^2)
Hayır
Bellman-Ford
O(V*E)
Evet
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Kısa soru
Bellman-Ford için neden tam olarak V - 1 tur, V veya V/2 değil?
(cevap bir sonraki slaytta)
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Cevap
Bir en kısa yol (negatif döngü yoksa) bir köşeyi asla tekrarlamaz — en fazla V - 1 kenar.
Her tur, her yolun "kesinleşmiş" önekini bir kenar uzatır. V - 1 tur, mümkün olan en uzun en kısa yolu kesinleştirir.
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
6. Tüm Çiftler En Kısa Yollar
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Başlangıç sorusu
Bir uçuş rezervasyon sistemi, ~20 şehrin her çifti arasında en ucuz ücrete aynı anda ihtiyaç duyar.
Dijkstra'yı 20 kez çalıştırmak işe yarar — işi paylaşmanın bir yolu var mı?
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Kısa tarihçe
Robert Floyd ve Stephen Warshall , ikisi de 1962
Bağımsız, yakından ilişkili matris algoritmaları
Birleşik algoritma her iki adı da taşır
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Fikir
Bir N x N matris dist[i][j]
Her köşe k için: i -> k -> j, dist[i][j]'den daha mı kısa?
Her köşeyi bir ara durak olarak dene
Yerinde güncelle — güvenli, çünkü dist[i][k]/dist[k][j] geçiş sırasında hiç değişmez
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Floyd-Warshall'ın kodu (C)
void floyd_warshall (int vertex_cnt) {
for (int k=0 ;k<vertex_cnt;k++) {
for (int i=0 ;i<vertex_cnt;i++) {
for (int j=0 ;j<vertex_cnt;j++) {
if (dist[i][k]==INF || dist[k][j]==INF)
continue ;
int through=dist[i][k]+dist[k][j];
if (through<dist[i][j])
dist[i][j]=through;
}
}
}
}
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Floyd-Warshall'ın kodu (Java)
static void floydWarshall (int vertexCnt) {
for (int k=0 ;k<vertexCnt;k++) {
for (int i=0 ;i<vertexCnt;i++) {
for (int j=0 ;j<vertexCnt;j++) {
if (dist[i][k]==INF || dist[k][j]==INF)
continue ;
int through=dist[i][k]+dist[k][j];
if (through<dist[i][j])
dist[i][j]=through;
}
}
}
}
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Floyd-Warshall: matris dolar
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Gerçek çıktı: Floyd-Warshall
-- normal: 5 vertices, negative edges but no negative cycle --
A B C E D
A 0 1 -3 -4 2
B 3 0 -4 -2 1
C 7 4 0 2 5
no negative cycle
-- edge: A-B-C-A is a negative cycle --
negative cycle at: A B C
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Karmaşıklık ve tuzak
O(V^3) süre, O(V^2) alan
Birkaç yüz köşe için pratik, daha fazlası için değil
Tuzak: k'yı en içteki döngü yapmak sessizce çöp hesaplar
Tuzak: == INF korumasını unutmak → tamsayı taşması
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Kısa soru
Bellman-Ford, bir başlangıçtan erişilebilen negatif döngüleri bulur. Floyd-Warshall'ın köşegen kontrolü bunları farklı nasıl bulur?
(cevap bir sonraki slaytta)
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Cevap
Sıfırın altına düşen herhangi bir dist[v][v]: v'den ayrılan bir yolun, yerinde kalmaktan daha ucuza geri döndüğü anlamına gelir.
Floyd-Warshall her çifti hesapladığı için, bu kontrol her köşe için aynı anda çalışır — ayrı bir başlangıç köşesine gerek yok.
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
7. Güçlü Bağlı Bileşenler
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Başlangıç sorusu
Kenar yönüne saygı göstererek hangi köşe grupları birbirine ulaşıp geri dönebilir ?
Bir döngü içinde birbirine bağlanan web sayfaları. Karşılıklı özyinelemeli fonksiyonlar.
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Kosaraju'nun fikri
Sergei Kosaraju , ~1978 (Micali ve Vazirani, 1981 üzerinden atfedilir)
Aşama 1: DFS, her köşenin bitiş zamanını kaydet
Aşama 2: Devrik (kenarları ters çevrilmiş) çizgede DFS
Kökleri azalan bitiş zamanı sırasıyla ziyaret et
Aşama 2'deki her DFS ağacı = bir GBB (güçlü bağlı bileşen)
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Kosaraju'nun kodu (C)
void dfs1 (int u) {
visited[u]=1 ;
for (AdjNode *n=cur_g->adj[u]; n; n=n->next)
if (!visited[n->to]) dfs1(n->to);
finish[finish_len++]=u;
}
void dfs2 (int u, int id) {
visited[u]=1 ; comp_of[u]=id;
for (AdjNode *n=cur_g->adjT[u]; n; n=n->next)
if (!visited[n->to]) dfs2(n->to, id);
}
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Kosaraju'nun kodu (Java)
static void dfs1 (int u) {
visited[u]=1 ;
for (AdjNode n=curG.adj[u]; n!=null ; n=n.next)
if (visited[n.to]==0 ) dfs1(n.to);
finish[finishLen]=u; finishLen++;
}
static void dfs2 (int u, int id) {
visited[u]=1 ; compOf[u]=id;
for (AdjNode n=curG.adjT[u]; n!=null ; n=n.next)
if (visited[n.to]==0 ) dfs2(n.to, id);
}
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Güçlü bağlı bileşenler
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Uç durum: tek bir büyük döngü
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Gerçek çıktı: güçlü bağlı bileşenler
-- normal: 8 vertices, 2 cyclic components + 2 singletons --
4 components:
A B C
D E F
G
H
-- edge: everything is one big cycle --
1 component:
A B C D E F G H
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Karmaşıklık ve tuzak
O(V + E) — iki tam DFS geçişi
Tuzak: aşama 2'yi aşama 1 ile aynı sırada çalıştırmak
Tersine çevrilmeli — buradaki en yaygın hata
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Kısa soru
Bir DAG 'da (hiç döngü yok), Kosaraju'nun algoritması kaç güçlü bağlı bileşen bulur?
(cevap bir sonraki slaytta)
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Cevap
Tam olarak V — köşe başına bir tane.
Hiçbir yerde döngü olmadığında, hiçbir köşe herhangi bir yoldan kendine dönemez, bu yüzden her bileşen tek başınadır (singleton). Bu, bu haftaki GBB animasyonundaki son uç durumdur.
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
8. İki Parçalı Çizgeler
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Başlangıç sorusu
Sınavları hiçbir öğrencinin aynı anda iki sınavı olmayacak şekilde planlayın. Bir öğrenciyi paylaşan dersler → bir kenar.
Bu çizge 2 renklenebilir mi — mümkün olan en basit ders programı?
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
İki renkli BFS
Başlangıcı 0 renklendir; her komşuyu karşıt renk yap
Zaten kuyrukta olan aynı renkli bir komşu mu? Çelişki — iki parçalı değil
Bileşen başına bir BFS (Hafta 5'in bileşenler döngüsü gibi)
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Tek sayılı döngü denkliği
Bir çizge, ancak ve ancak tek uzunluklu bir döngüsü yoksa iki parçalıdır.
Çift bir döngü renkleri kusursuzca değiştirir. Tek bir döngü tutarlı bir şekilde kapanamaz.
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
İki parçalılık kontrolü kodu (C) — bölüm 1/2
int is_bipartite (Graph *g) {
for (int i=0 ;i<g->vertex_count;i++) color_of[i]=-1 ;
for (int s=0 ;s<g->vertex_count;s++) {
if (color_of[s]!=-1 ) continue ;
color_of[s]=0 ; front=rear=0 ; enqueue(s);
while (front<rear) {
int u=dequeue();
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
İki parçalılık kontrolü kodu (C) — bölüm 2/2
for (AdjNode *n=g->adj[u]; n; n=n->next) {
if (color_of[n->to]==-1 )
{ color_of[n->to]=1 -color_of[u];
enqueue(n->to); }
else if (color_of[n->to]==color_of[u])
return 0 ;
}
}
}
return 1 ;
}
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
İki parçalılık kontrolü kodu (Java) — bölüm 1/2
static boolean isBipartite (Graph g) {
for (int i=0 ;i<g.vertexCount;i++) colorOf[i]=-1 ;
for (int s=0 ;s<g.vertexCount;s++) {
if (colorOf[s]!=-1 ) continue ;
colorOf[s]=0 ; front=rear=0 ; enqueue(s);
while (front<rear) {
int u=dequeue();
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
İki parçalılık kontrolü kodu (Java) — bölüm 2/2
for (AdjNode n=g.adj[u]; n!=null ; n=n.next) {
if (colorOf[n.to]==-1 )
{ colorOf[n.to]=1 -colorOf[u];
enqueue(n.to); }
else if (colorOf[n.to]==colorOf[u])
return false ;
}
}
}
return true ;
}
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
İki parçalı çizge kontrolü
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Uç durum: tek sayılı bir döngü
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Gerçek çıktı: iki parçalılık kontrolü
-- normal: an even cycle plus 2 safe diagonals --
colors: A=0 B=1 C=0 D=1 E=0 F=1 G=0 H=1
bipartite
-- edge: A-B-C-D-E-A is a 5-cycle (odd) --
colors: A=0 B=1 C=0 D=-1 E=1 F=1 G=-1 H=-1
NOT bipartite
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Karmaşıklık ve tuzak
O(V + E) — bir BFS
Tuzak: bağlı olmayan çizgeleri ele almamak
İkinci bir bileşende izole bir tek sayılı döngü, bileşen başına döngü olmadan görünmez kalır
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Kısa soru
Neden bir çelişki kenarı ("komşusuyla aynı renk") her zaman tek bir BFS katmanı içinde veya iki komşu katman arasında ortaya çıkar — asla bir katman atlamaz?
(cevap bir sonraki slaytta)
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Cevap
BFS, kaynaktan mesafe tek/çift durumuna göre kesin olarak renklendirir — çift mesafe 0 rengini, tek mesafe 1 rengini alır.
Herhangi bir kenar, BFS mesafeleri tam olarak 0 veya 1 farklı olan köşeleri bağlar (asla 2+ değil, yoksa doğrudan bir kenar olmazdı) — bu yüzden bir çelişki tam olarak orada ortaya çıkabilir.
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
9. En Büyük Akış
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Başlangıç sorusu
Bir su ağı: kaynak, hedef, kapasiteli borular.
Ağın aynı anda taşıyabileceği en büyük toplam akış nedir?
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Kısa tarihçe
Ford ve Fulkerson , 1956 — genel yöntem
Edmonds ve Karp , 1972 — her zaman en kısa genişletme yolunu kullan
Kanıtlandı: bu seçim polinom zaman garantiler
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Fikir
Boş kapasitesi olan, s'den t'ye herhangi bir genişletme yolu bul
Darboğazı it (yol üzerindeki en küçük kapasite)
İleri itmek bir ters kenar açar — sonraki bir yol bunu "geri alabilir"
"Hâlâ kullanılabilir" çizgesi, artık (residual) çizge dir
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
En büyük akış - en küçük kesim
En büyük akış, en ucuz kesime eşittir — s'yi t'den ayıran en küçük toplam kapasite.
Geriye genişletme yolu kalmaması = s'den BFS'in erişilebilir kümesi, o kesimin kendisidir .
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Edmonds-Karp kodu (C) — bölüm 1/2
int edmonds_karp (int vertex_cnt, int s, int t) {
int max_flow=0 ;
while (bfs_augmenting_path(vertex_cnt, s, t)) {
int bottleneck=INF;
for (int v=t; v!=s; v=parent_of[v])
if (cap_of[parent_of[v]][v]<bottleneck)
bottleneck=cap_of[parent_of[v]][v];
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Edmonds-Karp kodu (C) — bölüm 2/2
for (int v=t; v!=s; v=parent_of[v]) {
int u=parent_of[v];
cap_of[u][v]-=bottleneck;
cap_of[v][u]+=bottleneck;
}
max_flow+=bottleneck;
}
return max_flow;
}
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Edmonds-Karp kodu (Java) — bölüm 1/2
static int edmondsKarp (int vertexCnt, int s, int t) {
int maxFlow=0 ;
while (bfsAugmentingPath(vertexCnt, s, t)) {
int bottleneck=INF;
for (int v=t; v!=s; v=parentOf[v]) {
int u=parentOf[v];
if (capOf[u][v]<bottleneck)
bottleneck=capOf[u][v];
}
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Edmonds-Karp kodu (Java) — bölüm 2/2
for (int v=t; v!=s; v=parentOf[v]) {
int u=parentOf[v];
capOf[u][v]-=bottleneck;
capOf[v][u]+=bottleneck;
}
maxFlow+=bottleneck;
}
return maxFlow;
}
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Edmonds-Karp en büyük akış
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Gerçek çıktı: Edmonds-Karp
-- normal: 6 vertices, 10 edges, A to F --
max flow from A to F = 9
-- edge: A and J are in two separate components --
max flow from A to J = 0
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Karmaşıklık ve tuzak
Özellikle Edmonds-Karp için O(V * E^2)
Tuzak: ters kenar güncellemesini unutmak
Onsuz: sade Ford-Fulkerson, en iyi sonuçtan kısa kalabilir
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Kısa soru
Bölüm 3'ün union-find'ı "0 akış, s ve t bağlı değil" cevabını anında verebilirdi. Bu bölüm neden hâlâ önce tam bir BFS çalıştırıyor?
(cevap bir sonraki slaytta)
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Cevap
Union-find sadece erişilebilirliği bilir, kapasiteyi değil.
s ve t bağlı OLSA bile, gerçek en büyük akış yol boyunca darboğaz kapasitelerine bağlıdır — union-find'ın ebeveyn işaretçilerinin hiç kaydetmediği bir şey.
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
10. Geri İzleme
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Başlangıç sorusu
Bir haritayı, hiçbir iki komşu aynı rengi paylaşmayacak şekilde, mümkün olduğunca az renkle boyayın.
Bilinen bir formül yok. Sistematik olarak nasıl arama yaparsınız?
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Fikir: dene, özyinele, geri al
Kısmi bir çözümü bir kararla genişlet
Hâlâ tutarlı mı? Özyinele ve genişletmeye devam et
Tutarsız mı, veya her genişletme başarısız mı? Geri al ve bir sonraki seçeneği dene
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Neden çizge boyama, Hamilton yolu değil?
Boyama, Bölüm 8'in tam color[] satırını ve komşu-çelişki kontrolünü yeniden kullanır.
Bir Hamilton yolu, görece az ekstra kavrayış için tamamen yeni bir "şimdiye kadarki yol" kuralına ihtiyaç duyar.
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Geri izleme kodu (C)
int color_graph (int v, int k) {
if (v==cur_g->vertex_count) return 1 ;
for (int c=1 ;c<=k;c++) {
if (safe(v,c)) {
color_of[v]=c;
if (color_graph(v+1 ,k)) return 1 ;
color_of[v]=0 ;
}
}
return 0 ;
}
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Geri izleme kodu (Java)
static boolean colorGraph (int v, int k) {
if (v==curG.vertexCount) return true ;
for (int c=1 ;c<=k;c++) {
if (safe(v,c)) {
colorOf[v]=c;
if (colorGraph(v+1 ,k)) return true ;
colorOf[v]=0 ;
}
}
return false ;
}
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Geri izleme: çizge boyama
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Zorunlu uç durum: K4, çözülemez
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Gerçek çıktı: geri izlemeli çizge boyama
-- normal: 6 vertices, 10 edges, k=3 --
colouring: A=1 B=2 C=3 D=1 E=2 F=3
-- edge: K4 is UNSOLVABLE with k=3 --
no valid colouring with k=3
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Karmaşıklık ve tuzak
En kötü durum O(k^V) — son çare bir teknik
safe() erkenden büyük kısımları budar — kullanılabilir olmasının sebebi bu
Tuzak: geri alma adımını unutmak sonraki dalları bozar
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Kısa soru
K4, 4 renk gerektirir. Algoritma, k=3 ile "çözülemez" bildirmeden önce gerçekten kaç köşeyi boyamaya çalışır?
(cevap bir sonraki slaytta)
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Cevap
Her seferinde köşe 0'ın ötesine geri izleme yaptığında hepsini — ama başarısızlık köşe 3'te, K4'ün 4. köşesinde tespit edilir, çünkü ilk 3'ü aralarında zaten 3 mevcut rengin tamamını kullanmıştır.
safe() ardından köşe 3 için her rengi reddeder, başa kadar bir geri alma zinciri zorlar.
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Her program nasıl kontrol edildi
Her C programı -Wall -Wextra -Werror ile derlenir
Her Java programı -Xlint:all -Werror ile derlenir
C ve Java çıktısı bayt bayt özdeş olarak karşılaştırıldı, aynı senaryolar
Her birim test dosyası AddressSanitizer altında da yeniden derlendi
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Algoritma başına tek cümle
Kahn / DFS topolojik sıralama : her "önce" kuralına uyan sıra
Döngü tespiti : sadece var mı değil, hangi köşeler
Union-find : "aynı grup mu?" sorusu neredeyse sabit zamanda
Kruskal / Prim : her şeyi bağlamanın en ucuz yolu
Dijkstra / Bellman-Ford : bir başlangıçtan en ucuz yol
Floyd-Warshall : her çift arasındaki en ucuz yol, aynı anda
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Algoritma başına tek cümle (devam)
Kosaraju GBB : karşılıklı erişilebilirlik, yönlü
İki parçalılık kontrolü : bu tam olarak iki takıma bölünebilir mi?
Edmonds-Karp : bir ağın taşıyabileceği en büyük akış
Geri izleme : dene, özyinele, geri al — formülü olmayan problemler için
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Özet tablosu (1/3)
Problem
Algoritma
Süre
Sıralama
Kahn / DFS topo-sıralama
O(V+E)
Döngü var mı?
3 renkli DFS
O(V+E)
Gruplar
Union-find
~O(1) amortize
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Özet tablosu (2/3)
Problem
Algoritma
Süre
En ucuz bağlantı
Kruskal / Prim
O(E log E) / O(V^2)
En ucuz yol
Dijkstra / Bellman-Ford
O(V^2) / O(V*E)
Tüm çiftler yollar
Floyd-Warshall
O(V^3)
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Özet tablosu (3/3)
Problem
Algoritma
Süre
Karşılıklı erişim
Kosaraju GBB
O(V+E)
2 takıma bölme
İki parçalılık kontrolü
O(V+E)
En büyük akış
Edmonds-Karp
O(V*E^2)
Formül yok
Geri izleme
En kötü O(k^V)
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Alıştırmalar (birkaçını seçin)
Kahn'ın algoritmasını 5 kenarlı bir DAG üzerinde elle izleyin
Negatif bir kenarı olan ama negatif döngüsü olmayan bir çizge kurun
GBB'yi önemsiz (tek köşeli) bileşenleri işaretleyecek şekilde değiştirin
Her ağacın iki parçalı olduğunu kanıtlayın
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Kendini sınama: 3 hızlı soru
Dijkstra neden negatif bir kenarda başarısız olur?
Kosaraju'nun topolojik-sıralama-DFS'e kattığı TEK yeni fikir nedir?
Ters bir artık kenar, sonraki bir genişletme yoluna ne yapmasına izin verir?
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Sırada ne var
Hafta 10: İleri Ağaç Yapıları
AVL ağaçları, kırmızı-siyah ağaçlar, B-ağaçları — talihsiz eklemelerde O(log n)'in O(n)'e çökmesini önleyen kendi kendini dengeleyen makine.
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
CEN207 Veri Yapıları · Hafta 9
Sorular?
CEN207 Veri Yapıları · Hafta 9 · Çizge Algoritmaları
RTEÜ Bilgisayar Mühendisliği · Güz 2026–2027
Konuşma notu: Ara sınav haftasından sonra tekrar hoş geldiniz. Bu hafta, Hafta 5'teki her çizge aracını sıra, ağırlık ve döngü farkındalığıyla genişletiyor ve geri izleme ile kapanıyor.
Konuşma notu: On bir algoritma, on bölüm — bazı bölümler aynı problemi iki farklı yöntemle çözen algoritma çiftleri içeriyor.
Konuşma notu: Bu haftaki her algoritma, BFS veya DFS'i bir veya iki ek dizi ile genişletiyor. Burada hiçbir şey Hafta 5'in yerini almıyor — doğrudan onun üzerine inşa ediyor.
Konuşma notu: Kruskal, Prim, Dijkstra, Bellman-Ford, Floyd-Warshall, Edmonds-Karp hepsi ağırlık gerektirir. Diğer beşi ağırlıksız kalır.
Konuşma notu: Çizge gösteriminde hiçbir şey değişmiyor -- sadece üzerinde ne hesapladığımız değişiyor.
Konuşma notu: Bu tam olarak build-system / paket yöneticisi bağımlılık problemi.
Konuşma notu: Kahn'ın makalesinin adı tam olarak "Topological sorting of large networks".
Konuşma notu: Kuyruk, o anda yerleştirilmeye uygun olan her köşeyi aynı anda tutar.
Konuşma notu: Önce içe-dereceleri say, sonra içe-derecesi zaten 0 olan her köşeyi kuyruğa ekle.
Konuşma notu: Kuyruktan çıkan her köşenin komşularını gevşet, yeni içe-derecesi 0 olanları kuyruğa ekle.
Konuşma notu: Şimdiye kadar C sürümüyle aynı şekil.
Konuşma notu: C sürümüyle satır satır aynı şekil -- kod panelindeki satır numaralarının her iki dilde de anlamlı kalmasının sebebi bu.
Konuşma notu: Kuyruğun ve order satırının birlikte dolmasını izleyin. Sonra döngü uç durumunu deneyin.
Konuşma notu: Kuyruk erken boşalıyor — geriye kalan köşeler birbirleriyle bir döngü içinde kilitli.
Konuşma notu: Derlenmiş C programından alınan gerçek çıktı, Java programının çıktısıyla bayt bayt özdeş.
Konuşma notu: Hâlâ açık (gri) bir köşeye giden bir geri kenar, bedavaya yakalanan bir döngü demektir.
Konuşma notu: finish[] dizisi aşağıdan yukarıya dolar; çağıran, topolojik sıra için onu sondan başa okur.
Konuşma notu: Ziyaret edilmemiş her köşe için bir dfs_visit çağrısı -- bağlı olmayan bir DAG'ı kapsayan budur.
Konuşma notu: hasCycle, bir geri kenar görüldüğü anda ayarlanır, ama döngü her köşeyi bitirmek için devam eder.
Konuşma notu: C sürücüsüyle satır satır aynı şekil.
Konuşma notu: Kahn'ınkiyle aynı çizge — iki geçerli sırayı karşılaştırın.
Konuşma notu: Aynı DAG üzerindeki iki doğru algoritma kesin sırada uyuşmayabilir (ve genelde uyuşmaz).
Konuşma notu: Dinleyicilere 20 saniye verin.
Konuşma notu: Birden fazla geçerli sıranın genelde var olmasının sebebi de bu.
Konuşma notu: Kahn'ın algoritması bunu hiç cevaplayamaz -- sadece "bazı köşeler hiç 0'a ulaşmadı" der.
Konuşma notu: Döngüyü doğrudan yol dizisinden okuyabiliriz.
Konuşma notu: Beyaz bir komşu özyinelemeye girer; gri bir komşu bir atadır -- döngü-bulundu dalı bir sonraki slaytta devam ediyor.
Konuşma notu: Çıkarma döngüsü, yolun tepesinden gri ataya doğru geriye yürür.
Konuşma notu: Şimdiye kadar C sürümüyle aynı şekil.
Konuşma notu: onPath[] bir yığın olarak kullanılan sade bir dizidir -- girişte push, çıkışta pop.
Konuşma notu: Döngü köşelerinin kırmızıya dönüp çizgenin altında kutulanmasını izleyin.
Konuşma notu: Her köşe siyaha döner, hiçbir geri kenar bulunmaz.
Konuşma notu: 2 köşeli bir döngü, mümkün olan en küçük yönlü döngüdür -- tek bir kenar asla döngü olamaz.
Konuşma notu: Bu, Bölüm 1'in ileri/çapraz kenar tuzağıyla aynı.
Konuşma notu: Bu ödünleşim -- biraz daha fazla kayıt tutmaya karşılık çok daha fazla bilgi -- hafta boyunca tekrar eder.
Konuşma notu: "Aynı grup mu?" sorguları için özel olarak inşa edilmiş bir yapıya ihtiyacımız var.
Konuşma notu: Her grup küçük bir ağaçtır; kök, grubun kimliğinin ta kendisidir.
Konuşma notu: α, ters Ackermann fonksiyonudur — inşa edilebilecek her n için 5'in altındadır.
Konuşma notu: İkinci while döngüsü yol sıkıştırma adımıdır -- ziyaret edilen her köşeyi doğrudan köke yeniden bağlar.
Konuşma notu: Ham a/b argümanlarıyla değil, KÖK ile birleştirmek burada asla çiğnenmemesi gereken tek kuraldır.
Konuşma notu: C sürümüyle özdeş şekil -- union-find diller arasında neredeyse satır satır çevrilir.
Konuşma notu: C sürümüyle aynı rank-karşılaştırma merdiveni.
Konuşma notu: "already the same set" bir hata değildir -- zaten birleşmiş bir çift üzerinde union() her zaman güvenlidir, bir no-op'tur.
Konuşma notu: Gerçek bir derinlik-2 zincirin tek bir find() çağrısında derinlik 1'e düzleşmesini izleyin.
Konuşma notu: Ham argümanları birleştirmek, iki ebeveynli bir düğüm yaratabilir.
Konuşma notu: Bazı ders kitapları yalnızca "boyuta göre birleştirme" kullanır -- ikisi de doğrudur, bu ders yükseklik argümanı için rankı seçiyor.
Konuşma notu: Her çiftin doğrudan bir hatta ihtiyacı yok -- sadece herkesin herkesten erişilebilir olması yeterli.
Konuşma notu: Köşelerin herhangi bir bölümlenmesini kesen en ucuz kenar, mutlaka bir MST'ye aittir.
Konuşma notu: Kruskal ağacın "nerede" olduğunu umursamaz -- sadece döngülerden global olarak kaçınır.
Konuşma notu: Bu, Dijkstra için yeniden kullanacağımız "satır olarak öncelik kuyruğu" fikrinin aynısı.
Konuşma notu: Taze bir union-find, ardından ağırlığa göre tek bir global sıralama -- bir slayt önce anlatıldığı gibi.
Konuşma notu: find ve union_sets tam olarak Bölüm 3'ün union-find'ı, değişmeden.
Konuşma notu: Java'nın Comparator zinciri, C'nin qsort + karşılaştırma fonksiyonunun yerini alır -- aynı eşitlik bozma kuralı, farklı sözdizimi.
Konuşma notu: C sürümünün ikinci yarısıyla aynı döngü şekli.
Konuşma notu: Sıralı kenarlar satırının ve parent[] satırının birlikte büyümesini izleyin.
Konuşma notu: İki bileşen girer, iki ağaç çıkar — hata yok, sadece bir orman.
Konuşma notu: İki bileşen girer, iki ayrı ağaç çıkar, tek bir kenar listesinde toplanır.
Konuşma notu: key_of[], animasyonda çizgenin altında gösterilen öncelik kuyruğu satırının ta kendisidir.
Konuşma notu: u'yu ağaca getiren kenarı kaydet, ardından u'nun komşularını gevşet.
Konuşma notu: Şimdiye kadar C sürümüyle aynı şekil.
Konuşma notu: Java her MST kenarı için yeni bir Edge nesnesi ayırır; C önceden ayrılmış bir dizi hücresini doldurur -- tek gerçek fark bu.
Konuşma notu: Kruskal'ınkiyle aynı "normal" çizge — iki MST'yi karşılaştırın: aynı toplam ağırlık.
Konuşma notu: total weight = 20, aynı normal çizge üzerinde Kruskal'ınkiyle eşleşiyor -- canlı gösterilecek güzel bir çapraz kontrol.
Konuşma notu: Öncelik kuyruğunun görünür, basit bir satır olması için dizi sürümünü kullanıyoruz.
Konuşma notu: Toplam ağırlık değişmezdir; belirli kenar kümesi eşitliklerde değişmez değildir.
Konuşma notu: "En az kenar" değil (Hafta 5'in BFS'i) — en ucuz toplam ağırlık.
Konuşma notu: Dijkstra daha sonra bunu Amsterdam'da bir terasta, kağıt kalem olmadan tasarladığını söylemişti.
Konuşma notu: Prim'in algoritması, tek bir değişiklikle: "içeri giren en ucuz kenar", "şimdiye kadarki en ucuz yol" olur.
Konuşma notu: Programımızda Dijkstra'nın negatif girdiyi reddetmesinin tam sebebi bu.
Konuşma notu: min_dist_vertex, animasyonda bir satır olarak gösterilen "öncelik kuyruğu" adımıdır.
Konuşma notu: Az önce kesinleşen u köşesinin henüz bitmemiş her komşusunu gevşet.
Konuşma notu: Şimdiye kadar C sürümüyle aynı şekil.
Konuşma notu: minDistVertex küçük bir doğrusal tarama -- Java ve C sürümleri fiilen özdeş.
Konuşma notu: Öncelik kuyruğu satırı, bir yığın değil, sade sıralı bir dizidir.
Konuşma notu: "inf", bir köşeye hiç ulaşılamadığında tam olarak basılır -- programın kendi sentineli, bir çökme değil.
Konuşma notu: V-1 tur, mümkün olan en uzun en kısa yolun yayılması için tam olarak yeterlidir.
Konuşma notu: V-1 tura kadar, henüz hiç ulaşılmamış her köşeyi atlayarak.
Konuşma notu: Erken çıkış "if (!changed) break", yaygın ve doğru bir optimizasyondur.
Konuşma notu: Şimdiye kadar C sürümüyle aynı şekil.
Konuşma notu: boolean, C'nin int bayrağının yerini alır -- bunun dışında satır satır özdeş.
Konuşma notu: Tur sayacını ve sondaki tespit turunu izleyin.
Konuşma notu: A-B-C-A toplamı -1. Tespit turu hâlâ gevşetilebilir bir kenar buluyor.
Konuşma notu: Dijkstra'nınkiyle aynı başlangıç çizge şekli -- iki "distances:" satırını yan yana karşılaştırın.
Konuşma notu: Bellman-Ford'un negatifleri tolere etmenin bedeli, çok daha yavaş bir en kötü durum.
Konuşma notu: Bir köşeyi tekrarlamak, negatif olmayan ekstra ağırlıkla döngüye girmek demektir — asla bir iyileştirme değildir.
Konuşma notu: 20 * O(V^2)'ye karşı tek bir paylaşılan O(V^3) hesaplama.
Konuşma notu: Warshall'ınki erişilebilirlik için; Floyd'unki en kısa mesafeler için.
Konuşma notu: Bu yerinde güvenlik, nadir görülen hoş bir sadeleştirme.
Konuşma notu: k, EN DIŞTAKİ döngü olmalı — doğruluk kanıtının tamamı bu.
Konuşma notu: dist burada bir Java 2 boyutlu dizisidir, C'nin sabit boyutlu statik dizisindeki dist[i][k]'ye karşılık -- aynı erişim deseni.
Konuşma notu: Her ara köşe k için bir adım -- her (i,j) çifti için değil, yoksa bu çok fazla adım olurdu.
Konuşma notu: Negatif bir köşegen girişi (dist[A][A] < 0), o köşeden geçen bir negatif döngüyü işaret eden tam da budur.
Konuşma notu: Koruma olmadan INF + INF, büyük negatif bir sayıya taşabilir.
Konuşma notu: Daha zor, daha genel problemi çözmenin güzel bir kazanımı: bazı sorular daha zor değil, daha kolay hale gelir.
Konuşma notu: Hafta 5'in bağlı bileşenleri yönü tamamen görmezden gelir -- bu, yönlü sürümdür.
Konuşma notu: Bölüm 1'in tam DFS + bitiş zamanı makinesini yeniden kullandığı için Tarjan'ın tek geçişli algoritmasına tercih edildi.
Konuşma notu: dfs1 ve dfs2 neredeyse özdeş görünür — tek fark adj yerine adjT kullanmaları.
Konuşma notu: adjT, Graph inşa edilirken adj ile birlikte bir kez oluşturulan devrik çizgedir.
Konuşma notu: Aşama 1'in bitiş sırasını, ardından aşama 2'nin devrik-çizge DFS ağaçlarını izleyin.
Konuşma notu: Her şey her şeye ulaşabildiğinde, tam olarak bir GBB vardır.
Konuşma notu: İçinden döngü geçmeyen tek bir köşe, hâlâ geçerli bir GBB'dir -- sadece boyutu bir olan bir bileşen.
Konuşma notu: İki aşama arasında visited[]'i sıfırlamayı unutmak ikinci en yaygın hata.
Konuşma notu: Kullanışlı bir sağlama: GBB sayısı == köşe sayısı ancak ve ancak çizge bir DAG ise.
Konuşma notu: Genel çizge boyamadan (Bölüm 10) çok daha hızlı bir soru.
Konuşma notu: Bu denklik, doğrudan BFS renklendirme argümanından kanıtlanabilir.
Konuşma notu: Dış for-s döngüsü, bunu bağlı olmayan bir çizgede doğru yapan şeydir -- bileşenlerden yeniden kullanıldı.
Konuşma notu: Renk ataması, kuyruktan çıkarken değil, kuyruğa eklenirken gerçekleşir — bilerek.
Konuşma notu: Şimdiye kadar C sürümüyle aynı şekil.
Konuşma notu: Dış for-s döngüsü, bunu bağlı olmayan bir çizgede doğru yapan şeydir -- Bölüm 3'ün bileşenler fikrinden yeniden kullanıldı.
Konuşma notu: BFS'in ulaştığı anda çelişen bir kenarın kırmızı yanıp sönmesini izleyin.
Konuşma notu: Fonksiyon hemen döner — sonraki köşeler renksiz kalır, ve bu beklenen bir durumdur.
Konuşma notu: -1 rengi "BFS tarafından hiç ulaşılmadı" anlamına gelir -- arama, çelişkiyi bulduğu anda durdu.
Konuşma notu: Bir ağaç her zaman iki parçalıdır (hiç döngü yoktur) -- kısayol değil, kullanışlı bir sağlama.
Konuşma notu: Bu, iki slayt önceki tek-sayılı-döngü denkliğini kanıtlayan aynı mesafe-tek/çift fikri.
Konuşma notu: Rastgele bir yol seçimiyle Ford-Fulkerson patolojik derecede yavaş olabilir.
Konuşma notu: Edmonds-Karp'ın saf açgözlü bir yaklaşımı yenmesini sağlayan şey, ters kenardır.
Konuşma notu: Genişletme yollarının tükenmesinin sadece sonlanmayı değil, en iyilik durumunu da kanıtlamasının sebebi bu.
Konuşma notu: parent_of[] boyunca t'den s'ye ilk yürüyüş: yol üzerindeki en küçük artık kapasiteyi bul.
Konuşma notu: İkinci yürüyüş: darboğazı uygula, giderken bir ters artık kenarı açarak.
Konuşma notu: C sürümüyle aynı iki-yürüyüş şekli.
Konuşma notu: capOf, Java'da sade bir int[][] matrisidir, C'nin 2 boyutlu dizisiyle tam eşleşir.
Konuşma notu: Her kenar akış/kapasite gösterir; artık satırı her pozitif artık çifti listeler.
Konuşma notu: En büyük akış 0, tamamen geçerli bir cevaptır -- "hiç genişletme yolu yok" böyle görünür.
Konuşma notu: BFS yerine DFS hâlâ doğrudur ama polinom zaman garantisini kaybeder.
Konuşma notu: En büyük akışın neden düz bağlılıktan kesinlikle daha zor olduğunu da önizleyen güzel bir geri referans.
Konuşma notu: N-vezir, oturma planları ve Hamilton yolları hepsi bu şekli paylaşır.
Konuşma notu: "Backtracking" (geri izleme), özellikle geri alma adımını ifade eder.
Konuşma notu: Dört satır fikrin tamamını taşır: dene, özyinele, geri al; budamayı yapan da güvenlik kontrolü.
Konuşma notu: safe(v,c), Bölüm 8'in iki parçalılık çelişki kontrolüyle aynı şekilde kısa bir komşu taramasıdır.
Konuşma notu: Reddedilen bir renk kırmızı yanıp söner; geri alınan bir renk boşa döner.
Konuşma notu: Her kombinasyon denenir ve güvensiz bulunur -- şanslı bir başarı değil, kanıtlanmış bir başarısızlık.
Konuşma notu: "no valid colouring" ancak her dal denenip geri alındıktan sonra basılır -- kanıtlanmış bir olumsuzluk.
Konuşma notu: Geri izlemenin üstel sınıra rağmen işe yaramasının tüm sebebi bu.
Konuşma notu: Zaman varsa animasyon slaytında canlı izlemeye değer -- tam geri izleme zincirini izlemek bu algoritmanın can alıcı noktası.
Konuşma notu: Bu, sadece birkaçı için değil, bu haftaki her program için kullanılan run_tests.py hattıdır.
Konuşma notu: Haftanın ilk yarısı, birer satır.
Konuşma notu: İkinci yarı. Toplamda on bir algoritma, on problem (topolojik sıralamanın iki çözümü var).
Konuşma notu: Bu tablo, notun özet tablosunu tam olarak yansıtıyor, sığması için üç slayta bölündü.
Konuşma notu: Listeyi kapattığı için burada dört satır var -- yine de slayta rahatça sığıyor.
Konuşma notu: Tam on alıştırmalık liste bu haftanın notlarında.
Konuşma notu: Tam on sorulu quiz, cevaplarıyla birlikte, bu haftanın notlarında.
Konuşma notu: Bu hafta çoğunlukla diziler ve komşuluk listeleri üzerinde çalıştı -- Hafta 10 dengeli ağaçlara geri dönüyor.
Konuşma notu: Kendini sınama quiz'inden önce soru için söz açık.