Struktur Data & Algoritme
(
Data Structures & Algorithms
)
Fakultas Ilmu Komputer Universitas Indonesia Semester Genap - 2000/2001
Version 1.0 - Internal Use Only
Suryana Setiawansetiawan@cs.ui.ac.id
Maximum Flow
Motivation
Banyak masalah graph dalam dunia nyata berkaitan
dengan aliran material
Cairan: dalam suatu jaringan pipa yang mengalirkan minyak, berapa kapasitas debit (volume yang mengalir per satuan waktu) minyak melalui jaringan tersebut ?
Lalu lintas: dalam suatu jaringan jalan, berapa daya dukung jaringan jalan tersebut?
Proses: di bagian mana terjadinya bottleneck proses tersebut?
SDA/Max Flow/Sur/V1.0/3
1-Source, 1-Target Problem
Flow network Graph
Verteks pada symmetrical directed graph dihubungkan dengan sisi-sisi yang berupa saluran dengan
• c[u,v] kapasitas debit tertentu antara verteks u dan v •c[u,v] ≥ 0
•Jika c[u,v] berarti tidak ada sisi yang menghubungkan u dan v
• f[u,v] aliran yang terjadi antara verteks u dan v •f[v,u] = -f[u,v]
•f[u,v] ≤ c[u,v]
• cr[u,v] kapasitas debit sisa/residual yang tidak digunakan antar verteks u dan v
•cr[u,v] = c[u,v] – f[u,v]
Dua verteks disebut sebagai source s dan target/sink t
Ide Algoritma Ford-Fulkerson
Mendapatkan path residual antara s dan t, jika ada
maka
“aliri” melalui path tersebut dengan debit sesuai dengan residu terkecil di dalam path tersebut
Update setiap f[u,v] untuk setiap (u,v) dalam path sesuai dengan debit tersebut
Hitung residual cr[u,v] = c[u,f] – f[u,v] untuk setiap (u,v) dalam path sebagai residual terbaru
Ulangi hingga tidak ada path residual antara s dan t
SDA/Max Flow/Sur/V1.0/5
Algoritma Ford-Fulkerson
Membuat graph c simetris, jika ada c[u,v] sementara c[v,u] tidak ada dengan membuat c[v,u] = 0
Inisialisasi f[u,v] = f[v,u] = 0 untuk setiap (u,v) dalam graph Inisialisasi cr[u,v] = c[u,v] untuk setiap (u,v) dalam graph While (path=findPathDalamcr(s,t)) {
Tambahdebit = minimum {cr[u,v] | untuk setiap (u,v) dalam path}
For setiap sisi (u,v) dalam path { • f[u,v] += cr[u,v];
• f[v,u] = -f[u,v];
}
Update cr[u,v] = c[u,v] – f[u,v] untuk setiap (u,v) dalam path
Besarnya Aliran Maximum
Graph MaxFlow tidak bersifat unik (bisa beberapa
solusi) tetapi besarnya debit aliran unik (maksimum)
Aliran maximum dalam graph diperoleh dengan
menjumlahkan total flow yang keluar dari s atau total flow yang masuk ke t
SDA/Max Flow/Sur/V1.0/7
Contoh
s t v4 v3 v2 v1 16 13 10 4 12 9 14 20 4 7 -0 0 0 0 0 t 4 -0 7 0 0 v4 0 14 -0 4 0 v3 20 0 9 -0 0 v2 0 0 10 12 -0 V1 0 0 13 0 16 -S t v4 v3 v2 v1 s c KapasitasContoh: Inisialisasi
-0 0 0 0 0 T 0 -0 0 0 0 V4 0 0 -0 0 0 V3 0 0 0 -0 0 v2 0 0 0 0 -0 V1 0 0 0 0 0 -S t v4 v3 v2 v1 s f -0 0 0 0 0 t 4 -0 7 0 0 v4 0 14 -0 4 0 v3 20 0 9 -0 0 v2 0 0 10 12 -0 V1 0 0 13 0 16 -S t v4 v3 v2 v1 s crSDA/Max Flow/Sur/V1.0/9 s t v4 v3 v2 v1 16 13 10 4 12 9 14 20 4 7
Misalnya diperoleh path s-v1-v2-v3-v4-t Debit: min{16,12,9,14,4} = 4
Update setiap f[u,v] += 4 dan
f[v,u] = -f[u,v], untuk setiap (u,v) dalam path
Contoh: pencarian path 1
Contoh: iterasi 1
--4 0 0 0 0 T 4 --4 0 0 0 V4 0 4 --4 0 0 V3 0 0 4 --4 0 v2 0 0 0 4 --4 V1 0 0 0 0 4 -S t v4 v3 v2 v1 s w -4 0 0 0 0 t 0 -4 7 0 0 v4 0 10 -4 4 0 v3 20 0 5 -4 0 v2 0 0 10 8 -4 V1 0 0 13 0 12 -S t v4 v3 v2 v1 s crAliran Kapasitas Tersisa
SDA/Max Flow/Sur/V1.0/11 s t v4 v3 v2 v1 12 13 10 4 8 5 10 20 7 4 4 4 4 4
Misalnya diperoleh path s-v1-v3-v4-v2-t Debit: min{12,10,10,7,20}=7
Update setiap f[u,v] += 7 dan
f[v,u] = -f[u,v], untuk setiap (u,v) dalam path
Contoh: Pencarian path 2
--4 0 -7 0 0 T 4 --11 7 0 0 V4 0 11 --4 -7 0 V3 7 -7 4 --4 0 v2 0 0 7 4 --11 V1 0 0 0 0 11 -S t v4 v3 v2 v1 s f -4 0 7 0 0 t 0 -11 0 0 0 v4 0 3 -4 11 0 v3 13 7 5 -4 0 v2 0 0 3 8 -11 V1 0 0 13 0 5 -S t v4 v3 v2 v1 s cr
Aliran Kapasitas Tersisa
SDA/Max Flow/Sur/V1.0/13
Misalnya diperoleh path s-v3-v1-v2-t Debit: min{13,11,8,13}=8
Update setiap f[u,v] += 8 dan
f[v,u] = -f[u,v], untuk setiap (u,v) dalam path
s t v4 v3 v2 v1 5 13 3 11 8 5 3 13 7 11 4 4 11 4 7
Contoh: Pencarian path 3
--4 0 -15 0 0 T 4 --11 7 0 0 V4 0 11 --4 1 -8 V3 15 -7 4 --12 0 v2 0 0 -1 12 --11 V1 0 0 8 0 11 -S t v4 v3 v2 v1 s f -4 0 15 0 0 t 0 -11 0 0 0 v4 0 3 -4 3 8 v3 5 7 5 -12 0 v2 0 0 11 0 -11 V1 0 0 5 0 5 -S t v4 v3 v2 v1 s cr
Aliran Kapasitas Tersisa
Contoh: iterasi 3
SDA/Max Flow/Sur/V1.0/15
Tersisa path s-v3-v2-t Debit: min{5,4,5}=4
Update setiap f[u,v] += 4 dan
f[v,u] = -f[u,v], untuk setiap (u,v) dalam path
s t v4 v3 v2 v1 5 5 11 3 5 3 5 7 11 12 4 11 4 15 8
Contoh: Pencarian path 4
Contoh: iterasi 4
--4 0 -19 0 0 T 4 --11 7 0 0 V4 0 11 -0 1 -12 V3 19 -7 0 --12 0 v2 0 0 -1 12 --11 V1 0 0 12 0 11 -S t v4 v3 v2 v1 S w -4 0 19 0 0 t 0 -11 0 0 0 v4 0 3 -0 3 12 v3 1 7 9 -12 0 v2 0 0 11 0 -11 V1 0 0 1 0 5 -S T v4 v3 v2 v1 s crSDA/Max Flow/Sur/V1.0/17
Tidak adalagi path dari s ke maka selesai dengan graph aliran maksimum dinyatakan dalam f[u,v] dengan mengambil harga yang positif
s t v4 v3 v2 v1 5 1 11 3 9 3 1 7 11 12 11 4 19 12
Contoh: Pencarian path 5
s t v2 v1 11 12 1 12 19 4 7
COntoh: maximum flow hasil
Aliran maksimum dari s ke t adalah 23
SDA/Max Flow/Sur/V1.0/19
Masalah Algoritma
Pencarian path
merupakan hal yang paling kritikal dalam algoritma ini.
Kasus terburuk jika
terjadi situasi sbb.
Bila path yang
ditemukan selalu melalui v2-v3 atau v3-v2 maka iterasi akan terjadi dalam jumlah yang besar
Setiap iterasi debit dalam path yang ditemukan hanya 1 s t v3 v1 1 1000000 1000000 1000000 1000000
Pencarian path
Varian Algoritma Edmonds-Karp
Dengan BFS: “Shortest path” dengan arti jumlah sisi dalam path yang paling sedikit
SDA/Max Flow/Sur/V1.0/21
Analisis Algoritma
Pencarian flow path dilakukan pada maksimum E
buah sisi, jadi O(E).
Banyak iterasi adalah sama dengan jumlah flow path
yang ditemukan. Jika jumlah tsb adalah |f*| maka kompleksitas waktu adalah O(E |f*|)
Multi-source, Multi-target Problem
Dalam masalah yang lebih nyata source bisa berasal
dari sejumlah verteks menuju ke sejumlah verteks lainnya.
Apakah algoritma Ford-Fulkerson bisa digunakan? Contoh: s1 t2 t1 s2 16 13 10 4 12 9 20 4 7 SDA/Max Flow/Sur/V1.0/23 Penambahan dummy vertex u/ verteks source dengan sisi
mengarah ke setiap verteks source semula
Penambahan dummy vertex u/ vertex target dengan sisi
mengarah dari setiap verteks target semula
Setiap sisi yang ditambahkan berkapasitas sangat besar (tak
terhingga!) s1 t2 v2 v1 t1 s2 16 13 10 4 12 9 14 20 4 7 s0 ∞ ∞ t0 ∞ ∞
Maximum Bipartite Matching (MBM)
Bipartite Graph: dalam suatu undirected graph
G={V,E}, V terpartisi atas dua subset V1 dan V2 dan E’⊆ E dan setiap (u,v) ∈ E’ terpenuhi u ∈ V1 dan v ∈
V2.
Bipartite Matching: adalah E’’ dengan E’’⊆ E’, dimana
setiap (u,v) ∈ E’’ serta untuk v’ ≠ v dan u’ ≠ u, tidak
ada (u,v’) atau (u’,v) ∈ E’’.
Cardinality dari Bipartite Matching adalah |E’’|
Maximum Bipartite Matching adalah matching dengan
SDA/Max Flow/Sur/V1.0/25
v1 v2 v1 v2 v1 v2
Bipartite Graph, verteks terpartisi atas v1 dan v2
Bipartite Mathing, tidak
maksimal (cardinality 2) Maximal Bipartite Graph (cardinality 3)
Pencarian MBM sebagai Problem MaxFlow
Tambahkan verteks source dan sisi-sisi berarah yang
mengarah ke setiap verteks dalam V1 dengan kapasitas 1
Tambahkan verteks target dan sisi-sisi berarah yang
mengarah dari setiap verteks dalam V2 dengan kapasitas 1
Setiap sisi dalam G adalah sisi dengan kapasitas 1
dan berarah dengan arah dari verteks di V1 ke verteks di V2 SDA/Max Flow/Sur/V1.0/27 v1 v2
Contoh
Contoh Kasus
a b c d 0 0 0 1 1 s t d c b a s c a b c d s tSebagai Capacity Network Flow Graph (bobot tidak digambarkan karena berharga 1 atau 0)
Kapasitas dalam representasi matriks
SDA/Max Flow/Sur/V1.0/29 0 -1 0 0 0 t 0 0 0 0 0 d 1 0 0 -1 0 c 0 0 0 0 0 b 0 0 1 0 -1 a 0 0 0 0 1 s t d c b a s f
Jika path pertama s-a-c-t
a b c d s t 0 1 0 0 0 t 1 0 0 0 0 d 0 0 0 1 0 c 0 0 1 0 0 b 0 1 0 0 1 a 0 0 0 1 0 s t d c b a s cr -1 -1 0 0 0 t 1 0 0 -1 0 d 1 0 -1 0 0 c 0 0 1 0 -1 b 0 1 0 0 -1 a 0 0 0 1 1 s t d c b a s f
Jika path kedua s-b-c-a-d-t
1 1 0 0 0 t 0 0 0 1 0 d 0 0 1 0 0 c 0 0 0 0 1 b 0 0 1 0 1 a 0 0 0 0 0 s t d c b a s cr a c s t SDA/Max Flow/Sur/V1.0/31
Tidak ada lagi path dalam cr dari s ke t, maka
maxflow graph
Maka maximum matching adalah a-d dan b-c
a b c d s t a b c d