7    VisuAlgo.net / /mst Login Pohon Rentangan Minimum
Mode Eksplorasi ▿

>

>
pelan
cepat
go to beginning previous frame pause play next frame go to end

Sebuah Pohon Perentang (Spanning Tree, ST) dari sebuah graf terhubung tak-terarah berbobot G adalah sebuah sub-graf dari G yang merupakan sebuah pohon dan menghubungkan (merentangi) semua simpul-simpul dari G. Sebuah graf G dapat memiliki lebih dari satu ST, masing masing dengan bobot total (jumlah dari bobot-bobot sisi dalam ST) yang berbeda.


Sebuah Pohon Perentang Minimum (Minimum Spanning Tree, MST) dari adalah ST dari G yang memiliki bobot total terkecil dari seluruh ST yang ada.

Remarks: By default, we show e-Lecture Mode for first time (or non logged-in) visitor.
Please login if you are a repeated visitor or register for an (optional) free account first.

X Esc
Berikut PgDn

The MST problem is a standard graph (and also optimization) problem defined as follows: Given a connected undirected weighted graph G = (V, E), select a subset of edges of G such that the graph is still connected but with minimum total weight. The output is either the actual MST of G (there can be several possible MSTs of G) or usually just the minimum total weight itself (unique).


Pro-tip: Since you are not logged-in, you may be a first time visitor who are not aware of the following keyboard shortcuts to navigate this e-Lecture mode: [PageDown] to advance to the next slide, [PageUp] to go back to the previous slide, [Esc] to toggle between this e-Lecture mode and exploration mode.

X Esc
Sebelum PgUp
Berikut PgDn

Imagine that you work for a government who wants to link all rural villages in the country with roads.
(that is spanning tree).


The cost to build a road to connect two villages depends on the terrain, distance, etc.
(that is a complete undirected weighted graph).


You want to minimize the total building cost. How are you going to build the roads?
(that is minimum spanning tree).


Another pro-tip: We designed this visualization and this e-Lecture mode to look good on 1366x768 resolution or larger (typical modern laptop resolution in 2017). We recommend using Google Chrome to access VisuAlgo. Go to full screen mode (F11) to enjoy this setup. However, you can use zoom-in (Ctrl +) or zoom-out (Ctrl -) to calibrate this.

X Esc
Sebelum PgUp
Berikut PgDn

Masalah MST ini memiliki solusi-solusi polinomial.


Dalam visualisasi ini, kita akan mempelajari dua diantaranya: Algoritma Kruskal dan algoritma Prim. Keduanya diklasifikasikan sebagai Algoritma Greedy.

X Esc
Sebelum PgUp
Berikut PgDn

Lihat visualisasi algoritma MST di dikiri.


Pada awalnya, seluruh simpul dan sisi didalam graf masukan diwarnai dengan warna hitam pada latar belakang putih yang standar.

Pada akhir eksekusi algoritma MST, sisi-sisi dalam MST (dan semua simpul-simpulnya) akan diwarnai oranye dan sisi-sisi bukan-MST akan diwarnai abu-abu.
X Esc
Sebelum PgUp
Berikut PgDn

Terdapat dua sumber berbeda untuk menspesifikasikan graf masukan:

  1. Gambar Graf: Anda dapat menggambar graf terhubung tak-terarah berbobot apapun sebagai graf masukan.
  2. Graf-Graf Contoh: Anda dapat memilih dari daftar graf-graf contoh terhubung tak-terarah bebobot untuk membantu anda memulai.
X Esc
Sebelum PgUp
Berikut PgDn

Algoritma Kruskal: Sebuah algoritma MST greedy O(E log V) yang membentuk sebuah kumpulan hutan (forest) dari pohon-pohon perentang minimum dan kemudian menggabungkan semuanya menjadi sebuah MST.


Algoritma Kruskal membutuhkan sebuah algoritma pengurutan yang baik untuk mengurutkan sisi-sisi dari graf masukan berdasarkan bobot yang menaik dan struktur data lainnya bernama Himpunan Saling Lepas Gabung-Cari (Union-Find Disjoint Sets, UFDS) untuk membantu dalam pengecekan/pencegahan siklus.

X Esc
Sebelum PgUp
Berikut PgDn

Kruskal's algorithm first sort the set of edges E in non-decreasing weight (there can be edges with the same weight), and if ties, by increasing smaller vertex number of the edge, and if still ties, by increasing larger vertex number of the edge.


Discussion: Is this the only possible sort criteria?

X Esc
Sebelum PgUp
Berikut PgDn

e-Lecture: The content of this slide is hidden and only available for legitimate CS lecturer worldwide. Drop an email to visualgo.info at gmail dot com if you want to activate this CS lecturer-only feature and you are really a CS lecturer (show your University staff profile).

X Esc
Sebelum PgUp
Berikut PgDn

Then, Kruskal's algorithm will perform a loop through these sorted edges (that already have non-decreasing weight property) and greedily taking the next edge e if it does not create any cycle w.r.t edges that have been taken earlier.


Without further ado, let's try Kruskal on the default example graph (that has three edges with the same weight). Go through this animated example first before continuing.

X Esc
Sebelum PgUp
Berikut PgDn

To see on why the Greedy Strategy of Kruskal's algorithm works, we define a loop invariant: Every edge e that is added into tree T by Kruskal's algorithm is part of the MST.


At the start of Kruskal's main loop, T = {} is always part of MST by definition.


Kruskal's has a special cycle check in its main loop (using UFDS data structure) and only add an edge e into T if it will never form a cycle w.r.t the previously selected edges.


At the end of the main loop, Kruskal's can only select V-1 edges from a connected undirected weighted graph G without having any cycle. This implies that Kruskal's produces a Spanning Tree.


On the default example, notice that after taking the first 2 edges: 0-1 and 0-3, in that order, Kruskal's cannot take edge 1-3 as it will cause a cycle 0-1-3-0. Kruskal's then take edge 0-2 but it cannot take edge 2-3 as it will cause cycle 0-2-3-0.

X Esc
Sebelum PgUp
Berikut PgDn

We have seen in the previous slide that Kruskal's algorithm will produce a tree T that is a Spanning Tree (ST) when it stops. But is it the minimum ST, i.e. the MST?


To prove this, we need to recall that before running Kruskal's main loop, we have already sort the edges in non-decreasing weight, i.e. the latter edges will have equal or larger weight than the earlier edges.

X Esc
Sebelum PgUp
Berikut PgDn

At the start of every loop, T is always part of MST.


If Kruskal's only add a legal edge e (that will not cause cycle w.r.t the edges that have been taken earlier) with min cost, then we can be sure that w(T U e) ≤ w(T U any other unprocessed edge e' that does not form cycle) (by virtue that Kruskal's has sorted the edges, so w(e) ≤ w(e').


Therefore, at the end of the loop, the Spanning Tree T must have minimal overall weight w(T), so T is the final MST.


On the default example, notice that after taking the first 2 edges: 0-1 and 0-3, in that order, and ignoring edge 1-3 as it will cause a cycle 0-1-3-0. We can safely take the next smallest legal edge 0-2 (with weight 2) as taking any other legal edge (e.g. edge 2-3 with larger weight 3) will either create another MST with equal weight (not in this example) or another ST that is not minimum (which is this example).

X Esc
Sebelum PgUp
Berikut PgDn

There are two parts of Kruskal's algorithm: Sorting and the Kruskal's main loop.


The sorting of edges is easy. We just store the graph using Edge List data structure and sort E edges using any O(E log E) = O(E log V) sorting algorithm (or just use C++/Java sorting library routine) by increasing weight, smaller vertex number, higher vertex number. This O(E log V) is the bottleneck part of Kruskal's algorithm as the second part is actually lighter, see below.


Kruskal's main loop can be easily implemented using Union-Find Disjoint Sets data structure. We use IsSameSet(u, v) to test if taking edge e with endpoints u and v will cause a cycle (same connected component) or not. If IsSameSet(u, v) returns false, we greedily take this next smallest and legal edge e and call UnionSet(u, v) to prevent future cycles involving this edge. This part runs in O(E) as we assume UFDS IsSameSet(u, v) and UnionSet(u, v) operations run in O(1) for a relatively small graph.

X Esc
Sebelum PgUp
Berikut PgDn

Algoritma Prim: Sebuah algoritma MST greedy O(E log V) yang mengembangkan sebuah Pohon Perentang Minimum (Minimum Spanning Tree, MST) mulai dari sebuah simpul sumber sampai Pohon tersebut melingkupi keseluruhan graf.


Algoritma Prim membutuhkan struktur data Antrean Berprioritas (Priority Queue, PQ) (yang biasanya diimplementasikan menggunakan Timbunan Biner) untuk mengurutkan secara dinamis sisi-sisi yang sedang dipertimbangkan berdasarkan bobot yang menaik, sebuah struktur data Daftar Adjacency (Adjacency List) untuk enumerasi cepat tetangga-tetangga dari sebuah simpul, dan larik Boolean untuk membantu dalam pengecekan siklus.


Nama lain dari algoritma Prim adalah algoritma Jarnik-Prim.

X Esc
Sebelum PgUp
Berikut PgDn

Prim's algorithm starts from a designated source vertex s and enqueues all edges incident to s into a Priority Queue (PQ) according to increasing weight, and if ties, by increasing vertex number (of the neighboring vertex number). Then it will repeatedly do the following greedy steps: If the vertex v of the front-most edge pair information e: (w, v) in the PQ has not been visited, it means that we can greedily extends the tree T to include vertex v and enqueue edges connected to v into the PQ, otherwise we discard edge e.


Without further ado, let's try Prim(1) on the default example graph (that has three edges with the same weight). That's it, we start Prim's algorithm from source vertex s = 1. Go through this animated example first before continuing.

X Esc
Sebelum PgUp
Berikut PgDn

Prim's algorithm is a Greedy Algorithm because at each step of its main loop, it always try to select the next valid edge e with minimal weight (that is greedy!).


The convince us that Prim's algorithm is correct, let's go through the following simple proof: Let T be the spanning tree of graph G generated by Prim's algorithm and T* be the spanning tree of G that is known to have minimal cost, i.e. T* is the MST.


If T == T*, that's it, Prim's algorithm produces exactly the same MST as T*, we are done.


But if T != T*...

X Esc
Sebelum PgUp
Berikut PgDn

Assume that on the default example, T = {0-1, 0-3, 0-2} but T* = {0-1, 1-3, 0-2} instead.


Let ek = (u, v) be the first edge chosen by Prim's Algorithm at the k-th iteration that is not in T* (on the default example, k = 2, e2 = (0, 3), note that (0, 3) is not in T*).


Let P be the path from u to v in T*, and let e* be an edge in P such that one endpoint is in the tree generated at the (k−1)-th iteration of Prim's algorithm and the other is not (on the default example, P = 0-1-3 and e* = (1, 3), note that vertex 1 is inside T at first iteration k = 1).

X Esc
Sebelum PgUp
Berikut PgDn

If the weight of e* is less than the weight of ek, then Prim's algorithm would have chosen e* on its k-th iteration as that is how Prim's algorithm works.


So, it is certain that w(e*) ≥ w(ek).
(on the example graph, e* = (1, 3) has weight 1 and ek = (0, 3) also has weight 1).


When weight e* is = weight ek, the choice between the e* or ek is actually arbitrary. And whether the weight of e* is ≥ weight of ek, e* can always be substituted with ek while preserving minimal total weight of T*. (on the example graph, when we replace e* = (1, 3) with ek = (0, 3), we manage to transform T* into T).

X Esc
Sebelum PgUp
Berikut PgDn

But if T != T*... (continued)


We can repeat the substitution process outlined earlier repeatedly until T* = T and thereby we have shown that the spanning tree generated by any instance of Prim's algorithm (from any source vertex s) is an MST as whatever the optimal MST is, it can be transformed to the output of Prim's algorithm.

X Esc
Sebelum PgUp
Berikut PgDn

We can easily implement Prim's algorithm with two well-known data structures:

  1. A Priority Queue PQ (Binary Heap or just use C++ STL priority_queue/Java PriorityQueue), and
  2. A Boolean array of size V (to decide if a vertex has been taken or not, i.e. in the same connected component as source vertex s or not).

With these, we can run Prim's Algorithm in O(E log V) because we process each edge once and each time, we call Insert((w, v)) and (w, v) = ExtractMax() from a PQ in O(log E) = O(log V2) = O(2 log V) = O(log V). As there are E edges, Prim's Algorithm runs in O(E log V).

X Esc
Sebelum PgUp
Berikut PgDn

Quiz: Having seen both Kruskal's and Prim's Algorithms, which one is the better MST algorithm?

Kruskal's Algorithm
Prim's Algorithm
It Depends


Diskusi: Kenapa?

X Esc
Sebelum PgUp
Berikut PgDn

e-Lecture: The content of this slide is hidden and only available for legitimate CS lecturer worldwide. Drop an email to visualgo.info at gmail dot com if you want to activate this CS lecturer-only feature and you are really a CS lecturer (show your University staff profile).

X Esc
Sebelum PgUp
Berikut PgDn

Anda telah mencapai akhir dari materi-materi sederhana masalah graf Pohon Perentang Minimum (Min Spanning Tree, MST) dan dua algoritma-algoritma klasiknya: Kruskal dan Prim (ada yang lain, seperti Boruvka, tetapi tidak dibahas di visualisasi ini). Kami menyemangati anda untuk menjelajahi lebih lanjut di Mode Eksplorasi.


Tetapi, masalah-masalah MST yang lebih sulit bisa (jauh) lebih menantang dari versi dasarnya.


Saat anda lebih menguasai topik MST ini, kami menyemangati anda untuk mempelajari masalah-masalah graf yang lebih sulit dimana MST digunakan sebagai salah satu komponennya, misalkan algoritma aproksimasi untuk masalah-masalah NP-hard (Metric No-Repeat) TSP dan Steiner Tree (segera).

X Esc
Sebelum PgUp
Berikut PgDn

e-Lecture: The content of this slide is hidden and only available for legitimate CS lecturer worldwide. Drop an email to visualgo.info at gmail dot com if you want to activate this CS lecturer-only feature and you are really a CS lecturer (show your University staff profile).

X Esc
Sebelum PgUp
Berikut PgDn

For a few more challenging questions about this MST problem and/or Kruskal's/Prim's Algorithms, please practice on MST training module (no login is required, but short and of medium difficulty setting only).


However, for registered users, you should login and then go to the Main Training Page to officially clear this module (and its pre-requisites) and such achievement will be recorded in your user account.


Pro-tip: To attempt MST Online Quiz in easy or medium difficulty setting without having to clear the pre-requisites first, you have to log out first (from your profile page).

X Esc
Sebelum PgUp
Berikut PgDn

This MST problem can be much more challenging than this basic form. Therefore we encourage you to try the following two ACM ICPC contest problems about MST: UVa 01234 - RACING and Kattis - arcticnetwork.


Try them to consolidate and improve your understanding about this graph problem. You are allowed to use/modify our implementation code for Kruskal's/Prim's Algorithm that can be downloaded Here (ch4_03_kruskal_prim.cpp/java, from the companion Competitive Programming book website).

X Esc
Sebelum PgUp
Berikut PgDn

e-Lecture: The content of this slide is hidden and only available for legitimate CS lecturer worldwide. Drop an email to visualgo.info at gmail dot com if you want to activate this CS lecturer-only feature and you are really a CS lecturer (show your University staff profile).

X Esc
Sebelum PgUp
Berikut PgDn
Selagi aksi dijalankan, tiap langkahnya akan dijelaskan pada panel status.
X Esc
Sebelum PgUp
Berikut PgDn

e-Lecture: The content of this slide is hidden and only available for legitimate CS lecturer worldwide. Drop an email to visualgo.info at gmail dot com if you want to activate this CS lecturer-only feature and you are really a CS lecturer (show your University staff profile).

X Esc
Sebelum PgUp
Berikut PgDn
Kendalikan animasi dengan tombol kendali! Terdapat pula shortcut melalui keyboard:
Spasi: play/pause/replay
Panah kanan/kiri: maju ke depan/belakang
-/+: turunkan/tingkatkan kecepatan

X Esc
Sebelum PgUp
Berikut PgDn
Kembali ke 'Mode Eksplorasi' untuk memulai eksplorasi!

Harap diingat bahwa jika anda menemukan bug pada visualisasi ini atau bila anda ingin meminta fitur / visualisasi baru, jangan segan-segan untuk menghubungi pemimpin proyek ini: Dr Steven Halim melalui alamat emailnya: stevenhalim at gmail dot com.
X Esc
Sebelum PgUp

Gambar Grafik

Contoh Graf

Algoritma Kruskal

Algoritma Prim(s)

>

CP 4.10

CP 4.14

K5

Rail

Tessellation

s =

Lakukan

Tentang Tim Syarat Guna

Tentang

VisuAlgo digagas pada tahun 2011 oleh Dr Steven Halim sebagai alat untuk membantu murid-muridnya mengerti struktur data dan algoritma dengan memampukan mereka untuk mempelajari dasar-dasar struktur data dan algoritma secara otodidak dan dengan kecepatan mereka sendiri.


VisuAlgo mempunya banyak algoritma-algoritma tingkat lanjut yang dibahas didalam buku Dr Steven Halim ('Competitive Programming', yang ditulis bersama adiknya Dr Felix Halim) dan lebih lagi. Hari ini, beberapa dari visualisasi/animasi algoritma-algoritma tingkat lanjut ini hanya ditemukan di VisuAlgo.


Meskipun pada khususnya didesain untuk murid-murid National University of Singapore (NUS) yang mengambil berbagai kelas-kelas struktur data dan algoritma (contoh: CS1010, CS1020, CS2010, CS2020, CS3230, dan CS3233), sebagai pendukung pembelajaran online, kami berharap bahwa orang-orang di berbagai belahan dunia menemukan visualisasi-visualisasi di website ini berguna bagi mereka juga.


VisuAlgo tidak didesain untuk layar sentuh kecil (seperti smartphones) dari awalnya karena kami harus membuat banyak visualisasi-visualisasi algoritma kompleks yang membutuhkan banyak pixels dan gestur klik-dan-tarik untuk interaksinya. Resolusi layar minimum untuk pengalaman pengguna yang lumayan adalah 1024x768 dan hanya halaman utama VisuAlgo yang secara relatif lebih ramah dengan layar kecil.


VisuAlgo adalah proyek yang sedang terus berlangsung dan visualisasi-visualisasi yang lebih kompleks sedang dibuat.


Perkembangan yang paling menarik adalah pembuatan pertanyaan otomatis (sistem kuis online) yang bisa dipakai oleh murid-murid untuk menguji pengetahuan mereka tentang dasar-dasar struktur data dan algoritma. Pertanyaan-pertanyaan dibuat secara acak dengan semacam rumus dan jawaban-jawaban murid-murid dinilai secara instan setelah dikirim ke server penilai kami. Sistem kuis online ini, saat sudah diadopsi oleh banyak dosen Ilmu Komputer diseluruh dunia, seharusnya bisa menghapuskan pertanyaan-pertanyaan dasar tentang struktur data dan algoritma dari ujian-ujian di banyak Universitas. Dengan memberikan bobot kecil (tapi tidak kosong) supaya murid-murid mengerjakan kuis online ini, seorang dosen Ilmu Komputer dapat dengan signifikan meningkatkan penguasaan materi dari murid-muridnya tentang pertanyaan-pertanyaan dasar ini karena murid-murid mempunyai kesempatan untuk menjawab pertanyaan-pertanyaan ini yang bisa dinilai secara instan sebelum mereka mengambil kuis online yang resmi. Mode latihan saat ini mempunyai pertanyaan-pertanyaan untuk 12 modul visualisasi. Kami akan segera menambahkan pertanyaan-pertanyaan untuk 8 modul visualisasi lainnya sehingga setiap every modul visualisasi di VisuAlgo mempunyai komponen kuis online.


Cabang pengembangan aktif lainnya adalah sub-proyek penerjemahan dari VisuAlgo. Kami mau menyiapkan basis data kosa kata Ilmu Komputer dalam bahasa Inggris yang digunakan di sistem VisuAlgo. Ini adalah pekerjaan besar yang membutuhkan crowdsourcing. Saat sistem tersebut siap, kami akan mengundang beberapa dari anda untuk berkontribusi, terutama bila bahasa Inggris bukan bahasa ibu anda. Saat ini, kami juga telah menulis catatan-catatan publik tentang VisuAlgo dalam berbagai bahasa:
zh, id, kr, vn, th.

Tim

Pemimpin & Penasihat Proyek (Jul 2011-sekarang)
Dr Steven Halim, Senior Lecturer, School of Computing (SoC), National University of Singapore (NUS)
Dr Felix Halim, Software Engineer, Google (Mountain View)

Murid-Murid S1 Peniliti 1 (Jul 2011-Apr 2012)
Koh Zi Chun, Victor Loh Bo Huai

Murid-Murid Proyek Tahun Terakhir/UROP 1 (Jul 2012-Dec 2013)
Phan Thi Quynh Trang, Peter Phandi, Albert Millardo Tjindradinata, Nguyen Hoang Duy

Murid-Murid Proyek Tahun Terakhir/UROP 2 (Jun 2013-Apr 2014)
Rose Marie Tan Zhao Yun, Ivan Reinaldo

Murid-Murid S1 Peniliti 2 (May 2014-Jul 2014)
Jonathan Irvin Gunawan, Nathan Azaria, Ian Leow Tze Wei, Nguyen Viet Dung, Nguyen Khac Tung, Steven Kester Yuwono, Cao Shengze, Mohan Jishnu

Murid-Murid Proyek Tahun Terakhir/UROP 3 (Jun 2014-Apr 2015)
Erin Teo Yi Ling, Wang Zi

Murid-Murid Proyek Tahun Terakhir/UROP 4 (Jun 2016-Dec 2017)
Truong Ngoc Khanh, John Kevin Tjahjadi, Gabriella Michelle, Muhammad Rais Fathin Mudzakir

List of translators who have contributed ≥100 translations can be found at statistics page.

Ucapan Terima Kasih
Proyek ini dimungkinkan karena Hibah Pengembangan Pengajaran dari NUS Centre for Development of Teaching and Learning (CDTL).

Syarat Guna

VisuAlgo bebas biaya untuk komunitas Ilmu Komputer di dunia. Jika anda menyukai VisuAlgo, satu-satunya pembayaran yang kami minta dari anda adalah agar anda menceritakan keberadaan VisuAlgo kepada murid-murid/dosen-dosen Ilmu Komputer yang anda tahu =) lewat Facebook, Twitter, situs mata kuliah, ulasan di blog, email, dsb.


Jika anda adalah murid/dosen struktur data dan algoritma, anda diijinkan untuk menggunakan situs ini secara langsung di kelas-kelas anda. Jika anda mengambil screen shots (video-video) dari situs ini, anda dapat menggunakan screen shots (video-video) tersebut ditempat lain asalkan anda menyebut URL dari situs ini (http://visualgo.net) dan/atau daftar publikasi dibawah ini sebagai referensi. Tetapi, anda TIDAK diijinkan untuk mengunduh berkas-berkas VisuAlgo (sisi-klien) dan memasangnya di situs anda sendiri karena itu dikategorikan sebagai plagiat. Saat ini, kami TIDAK mengijinkan orang lain untuk membuat cabang/varian dari proyek VisuAlgo ini. Menggunakan kopi offline (sisi-klien) dari VisuAlgo untuk kepentingan pribadi diijinkan.


Ingat bahwa komponen kuis online dari VisuAlgo secara natur membutuhkan sisi-server dan tidak bisa dengan mudah disimpan di komputer lokal. Saat ini, publik hanya bisa menggunkaan 'mode latihan' untuk mengakses sistem kuis online. Saat ini, 'mode ujian' adalah sistem untuk mengakses pertanyaan-pertanyaan acak ini yang digunakan untuk ujian resmi di NUS. Dosen-dosen Ilmu Komputer yang lain harus menghubungi Steven jika anda mau mencoba 'mode ujian' tersebut.


Dafatar Publikasi


Karya ini telah dipresentasikan singkat pada CLI Workshop sewaktu ACM ICPC World Finals 2012 (Poland, Warsaw) dan pada IOI Conference di IOI 2012 (Sirmione-Montichiari, Italy). Anda bisa mengklik link ini untuk membaca makalah kami tahun 2012 tentang sistem ini (yang belum disebut sebagai VisuAlgo pada tahun 2012 tersebut).


Karya ini dibuat denbgan bantuan bekas murid-murid saya. Laporan-laporan proyek yang cukup mutakhir bisa dibaca disini: Erin, Wang Zi, Rose, Ivan.


Laporan Bug atau Meminta Fitur Baru


VisuAlgo bukanlah proyek yang sudah selesai. Dr Steven Halim masih aktif dalam mengembangkan VisuAlgo. Jika anda adalah pengguna VisuAlgo dan menemukan bug di halaman visualisasi/sistem kuis online atau jika anda mau meminta fitur baru, silahkan hubungi Dr Steven Halim. Alamat emailnya adalah gabungan dari namanya dan tambahkan gmail titik com.