Bir kaynaktan hedefe taşınabilecek maksimum akışı bulmak için artık grafları (residual graphs) tarayan Ford-Fulkerson algoritması ve ilişkili min-cut teoremini kapsar.
Ağ Akışı (Network Flow), yönlü kenarların belirli kapasiteleri olduğu bir akış ağında (flow network), kaynaktan (source) hedefe (sink) birim zamanda aktarılabilecek en yüksek veri/madde miktarını bulma problemidir.
Ford-Fulkerson algoritması, akış değerini her adımda artırarak maksimum seviyeye ulaştırır. Algoritma, grafın "artık graf" (residual graph) gösterimini kullanarak kapasitesi dolmamış yolları (augmenting paths) arar. BFS (Edmonds-Karp varyantı) veya DFS ile bulunan her yolun minimum geçiş kapasitesi kadar akış ağa eklenir ve kenarların kalan kapasiteleri güncellenir.
Maksimum Akış / Minimum Kesik (Max-Flow/Min-Cut) teoremi, bir akış ağındaki maksimum akış değerinin, kaynağı hedeften ayıran kesik kenarlarının (cut) alabileceği minimum kapasiteye tam olarak eşit olduğunu kanıtlar. Bu kesik, ağdaki en dar darboğazı (bottleneck) gösterir.
Aşağıdaki uygulamalar PDF kaynaklarındaki pseudo kod akışını modern veri yapılarıyla ifade eder. Kenar durumları görünür bırakıldığı için örnekler doğrudan test edilebilir.
1class FordFulkerson {2 private size: number;3 private capacities: number[][];4 private flows: number[][];56 constructor(size: number) {7 this.size = size;8 this.capacities = Array.from({ length: size }, () => Array(size).fill(0));9 this.flows = Array.from({ length: size }, () => Array(size).fill(0));10 }1112 addEdge(u: number, v: number, cap: number) {13 this.capacities[u][v] = cap;14 }1516 private bfs(s: number, t: number, parent: number[]): boolean {17 const visited = Array(this.size).fill(false);18 const queue: number[] = [s];19 visited[s] = true;2021 while (queue.length > 0) {22 const u = queue.shift()!;23 for (let v = 0; v < this.size; v++) {24 const residual = this.capacities[u][v] - this.flows[u][v];25 if (!visited[v] && residual > 0) {26 parent[v] = u;27 visited[v] = true;28 if (v === t) return true;29 queue.push(v);30 }31 }32 }33 return false;34 }3536 getMaxFlow(s: number, t: number, trace?: string[]): number {37 const parent = Array(this.size).fill(-1);38 let maxFlow = 0;3940 while (this.bfs(s, t, parent)) {41 let pathFlow = Infinity;42 // Yol üzerindeki darboğazı bul43 for (let v = t; v !== s; v = parent[v]) {44 const u = parent[v];45 pathFlow = Math.min(pathFlow, this.capacities[u][v] - this.flows[u][v]);46 }4748 if (trace) {49 const path: number[] = [];50 for (let v = t; v !== s; v = parent[v]) path.push(v);51 path.push(s);52 trace.push(`Yol Bulundu: ${path.reverse().join(' -> ')} (Kapasite: ${pathFlow})`);53 }5455 // Kapasiteleri ve akışları güncelle56 for (let v = t; v !== s; v = parent[v]) {57 const u = parent[v];58 this.flows[u][v] += pathFlow;59 this.flows[v][u] -= pathFlow;60 }61 maxFlow += pathFlow;62 }63 return maxFlow;64 }65}Kenar kapasitelerini formatta girin (U-V-Kapasite). S=0 ve T=3 olarak simüle edilir. Örnek: 0-1-10, 0-2-5, 1-3-5, 2-3-10, 1-2-2
Kenar kapasitelerini formatta girin (U-V-Kapasite). S=0 ve T=3 olarak simüle edilir. Örnek: 0-1-10, 0-2-5, 1-3-5, 2-3-10, 1-2-2
En İyi Durum: O(E * f) f: max flow
Ortalama Durum: O(V * E^2) Edmonds-Karp varyantı
En Kötü Durum: O(E * f)
O(V^2) akış ve kapasite matrisleri - Bu algoritmanın karmaşıklığı belirtilmemiş.
Ağ Akışı (Network Flow) Algoritması ile benzer veya alternatif olarak değerlendirilebilecek diğer başlıklar: