Anda di halaman 1dari 11

LAPORAN PRAKTIKUM ALGORITMA DAN

STRUKTUR DATA
PROGRAM TEKNOLOGI INFORMASI DAN ILMU
KOMPUTER
UNIVERSITAS BRAWIJAYA
BAB : ADT GRAPH
NAMA : FAKHRUZZAHID WAHDAH
NIM : 145150207111146
TANGGAL : 08/12/2015
ASISTEN : - ANDRIANSYAH YUSUF RIZAL
- RENO PUTRA PRAWIRA

A. DEFINISI MASALAH
1. Tambahkan method untuk mengetahui berapa jumlah edge yang masuk atau
keluar dari suatu node.
2. Tambahkan pada ADT program di atas untuk merepresentasikan graph dengan
matrik adjacency.
3. Buatlah sub program untuk mendapatkan tetangga dari suatu node tertentu.
4. Lakukan penulusuran node dari grap menggunakan BFS dan BFS. Gunakan
struktur data yang pernah dibuat stack atau antrian.
5. Lakukan modifikasi pada ADT graph di atas sehingga suatu hubungan antar node
terdapat nilai jarak.
6. Berdasarkan hasil modifikasi pada tugas 5 susun method untuk menghitung jarak
terpendek dari suatu node asal ke node tujuan.

B. SOURCE CODE

Graph.java
1 public class Graph {
2 public class Node {
3 // atribut data
4 private final int data;
5 private final int jarak;
6 private final Node next;
7 // constructor Node
8 public Node(Node n, int dt, int jarak) {
9 data = dt;
10 next = n;
11 this.jarak = jarak;
12 }
13 // function getter atribut data
14 public int getData() {
15 return data;
16 }
17 // function getter atribut next
18 public Node getNext() {
19 return next;
20 }
21 // function getter atribut jarak
22 public int getJarak() {
23 return jarak;
24 }
25 }
26 public class Route {
27 //atribut data
28 public int jarak;
29 public int[] Lintasan;
30 public int CP;
31 public Route(int jNode) {
32 jarak = 0;
33 CP = 0;
34 Lintasan = new int[jNode];
35 }
36 void push(int Push, int jarak) {
37 Lintasan[CP] = Push;
38 CP++;
39 this.jarak += jarak;
40 }
41 }
42 // Atribut data
43 private int[][] dt1;
44 private int[] dt2;
45 private final Node[] node;
46 private final int jNode;
47 private int current = 0;
48 // Constructor untuk class Graph
49 public Graph(int n) {
50 jNode = n;
51 node = new Node[jNode];
52 // Mencari jumlah node
53 for (int i = 0; i < jNode; i++) {
54 node[i] = null;
55 dt1 = new int[n][n];
56 }
57 }
58 // Procedure untuk mengecek rute dengan parameter 5
59 public void checkRoute() {
60 int[] i = new int[jNode];
61 Route[] rute = new Route[5];
62 }
63 // Procedure menambahkan matrik Adjacency
64 public void addAdj(int head, int adj, int jarak) {
65 Node n = new Node(node[head], adj, jarak);
66 node[head] = n;
67 current++;
68 dt1[head][adj]++;
69 }
70 // procedure untuk mencetak matrik adjacency
71 public void adjacency() {
72 int i;
73 System.out.print(" ");
74 for (i = 0; i < jNode; i++) {
75 System.out.printf("[%d] ", i);
76 }
77 System.out.println();
78 //mencari angka matrik
79 for (i = 0; i < jNode; i++) {
80 System.out.printf("[%d]", i);
81 for (int j = 0; j < jNode; j++) {
82 Node n = node[i];
83 boolean ketemu = false;
84 while (n != null) {
85 if (n.getData() == j) {
86 System.out.print(" 1 ");
87 ketemu = true;
88 break;
89 }
90 n = n.getNext();
91 }
92 if (!ketemu) {
93 System.out.print(" 0 ");
94 }
95 }
96 System.out.println();
97 }
98 }
99 // procedure untuk mencari jumlah edge yang masuk dari
100 suatu node
101 public int edgeMasuk(int hitung) {
102 int masuk = 0;
103 for (int i = 0; i < jNode; i++) {
104 Node nodeCari = node[i];
105 while (nodeCari != null) {
106 if (hitung == nodeCari.getData()) {
107 ++masuk;
108 }
109 nodeCari = nodeCari.getNext();
110 }
111 }
112 return masuk;
113 }
114 // procedure untuk mencari jumlah edge yang keluar dari
115 suatu node
116 public int edgeKeluar(int indeks) {
117 Node nodeCari = node[indeks];
118 int keluar = 0;
119
120 while (nodeCari != null) {
121 ++keluar;
122 nodeCari = nodeCari.getNext();
123 }
124 return keluar;
125 }
126 // procedure untuk penelusuran node menggunakan BFS
127 public void bfs() {
128 System.out.println("\nBreadth First Search : ");
129 boolean cari = false;
130 dt2 = new int[jNode];
131 dt2[0] = 0;
132 System.out.print(dt2[0]);
133 int Checkpoint = 1;
134 int i = 0;
135 int p = 1;
136 while (dt2[jNode - 1] == 0) {
137 for (int j = 0; j < jNode; j++) {
138 if (dt1[i][j] >= 1) {
139 for (int f : dt2) {
140 if (dt2[f] == j) {
141 cari = true;
142 }
143 }
144 if (cari != true) {
145 dt2[Checkpoint] = j;
146 Checkpoint++;
147 }
148 }
149 cari = false;
150 }
151 i = dt2[p];
152 p++;
153 }
154 for (int l = 1; l < jNode; l++) {
155 System.out.print(" -> " + dt2[l]);
156 }
157 System.out.println();
158 }
159 public int checkpoint = 1;
160 public boolean find = false;
161 // procedure untuk penelusuran node menggunakan BFS
162 public void dfs(int i) {
163 dt2 = new int[jNode];
164 System.out.printf("Depth first search(%d) :\n", i);
165 DFS(0);
166 System.out.print(0);
167 for (int w = 1; w < jNode; w++) {
168 if (i == 0) {
169 break;
170 } else if (i != dt2[w]) {
171 System.out.print(" -> " + dt2[w]);
172 } else if (i == dt2[w]) {
173 System.out.println(" -> " + dt2[w]);
174 break;
175 }
176 }
177 System.out.println();
178 }
179 // procedure untuk mencari DFS
180 public void DFS(int i) {
181 int[] S = new int[jNode + 1];
182 int s = 0;
183 find = false;
184 //mencari jumlah node
185 for (int j = 0; j < jNode; j++) {
186 if (dt1[i][j] >= 1) {
187 for (int w : dt2) {
188 if (dt2[w] == j) {
189 find = true;
190 }
191 }
192 if (find != true) {
193 S[s] = j;
194 s++;
195 }
196 }
197 find = false;
198 }
199 for (int k = 0; k < jNode; k++) {
200 for (int w = 0; w < jNode; w++) {
201 if (S[k] == dt2[w]) {
202 find = true;
203 }
204 }
205 if (find != true) {
206 dt2[checkpoint] = S[k];
207 checkpoint++;
208 DFS(S[k]);
209 }
210 find = false;
211 }
212 }
213 // function getter atribut current
214 public int getCurent() {
215 System.out.println("Total " + current);
216 return current;
217 }
218 // procedure untuk mencetak vertex
219 public void cetak() {
220 //mencari angka ke berapa dalam matrik
221 for (int i = 0; i < jNode; i++) {
222 System.out.print("[" + i + "]");
223 Node n = node[i];
224 while (n != null) {
225 System.out.print(" " + "(Jarak = " +
226 n.getJarak() + ")->" + n.getData());
227 n = n.getNext();
228 }
229 System.out.println();
230 }
231 }
232 //main method
233 public static void main(String s[]) {
234 Graph g = new Graph(5);
235 g.addAdj(0, 3, 1);
236 g.addAdj(0, 1, 2);
237 g.addAdj(1, 4, 4);
238 g.addAdj(1, 2, 4);
239 g.addAdj(2, 4, 8);
240 g.addAdj(2, 1, 2);
241 g.addAdj(4, 3, 3);
242 g.cetak();
243 System.out.println();
244 System.out.println("Graph Matrik Adjacency");
245 g.adjacency();
246 System.out.println();
247 g.getCurent();
248 System.out.printf("Vertex 0 edge masuk %d edge
249 keluar %d \n", g.edgeMasuk(0), g.edgeKeluar(0));
250 System.out.printf("Vertex 1 edge masuk %d edge
251 keluar %d \n", g.edgeMasuk(1), g.edgeKeluar(1));
252 System.out.printf("Vertex 2 edge masuk %d edge
253 keluar %d \n", g.edgeMasuk(2), g.edgeKeluar(2));
254 System.out.printf("Vertex 3 edge masuk %d edge
255 keluar %d \n", g.edgeMasuk(3), g.edgeKeluar(3));
256 System.out.printf("Vertex 4 edge masuk %d edge
257 keluar %d \n", g.edgeMasuk(4), g.edgeKeluar(4));
258 g.bfs();
259 System.out.println();
260 g.dfs(4);
261 }
262 }

C. PEMBAHASAN
Graph.java
1 Deklarasi kelas bertipe public dengan nama Graph
2 Deklarasi kelas bertipe public dengan nama Node
4 Deklarasi variabel bertipe private final integer dengan nama data
5 Deklarasi variabel bertipe private final integer dengan nama jarak
6 Deklarasi variabel bertipe private final Node dengan nama next
8 Deklarasi konstruktor kelas Node dan berparameter Node n, int dt, int jarak
9 Inisialisasi variabel data denagan nilai dt dari parameter
10 Inisialisasi variabel next dengan nilai n dari parameter
11 Inisialisasi variabel jarak denagn nilai jarakdari parameter
14 Deklarassi method bertipe public integer dengan nama getData
15 Mengembalikan nilai dari variabel data
18 Deklarasi method bertipe public Node dengan nama getNext
19 Mengembalikan nilai dari variabel next
22 Deklarasi method bertipe public integer dengan nama getJarak
23 Mengembalikan nilai dari variabel jarak
26 Deklarasi kelas bertipe public dengan nama Route
28 Deklarasi variabel bertipe public integer dengan nama jarak
29 Deklarasi variabel bertipe public array of integer dengan nama Lintasan
30 Deklarasi variabel bertipe public integer dengan nama CP
31 Deklarasi konstruktor kelas Route dan berparameter integer jNode
32 Inisialisasi variabel jarak dengan nilai 0
33 Inisialisasi variabel CP dengan nilai 0
34 Instansiasi variabel Lintasan denagn panjang indeks array sama dengan nilai dari
variabel jNode
36 Deklarasi method bertipe void dengan nama push dan berparameter int Push, int jarak
37 Memberikan nilai pada variabel Lintasan dengan indeks array ke-CP dengan nilai
Push dari parameter
38 Nilai variabel CP ditambah 1
39 Memberikan nilai pada variabel jarak dengan nilai jarak dari parameter dan nilai
disimpan pada variabel jarak
43 Deklarasi variabel bertipe private double array of integer dengan nama dt1
44 Deklarasi variabel bertipe private array of integer dengan nama dt2
45 Deklarasi variabel bertipe private final array of Node dengan nama node
46 Deklarasi variabel bertipe private final integer dengan nama jNode
47 Deklarasi dan inisialisasi variabel bertipe private integer dengan nama current dengan
nilai 0
49 Deklarasi konstruktor kelas Graph dan berparameter int n
50 Inisialisasi variabel jNode dengan nilai n dari parameter
51 Instansiasi variabel node dengan panjang indeks array sama dengan nilai dari variabel
Node
53 Perulangan for denagn kondisi int i = 0; i < jNode; i++
54 Memberikan nilai pada variabel node indeks ke-i dengan nilai null
55 Instansiasi variabel dt1 dengan panjang indeks array sama dengan n x n dari
parameter
59 Deklarasi method bertipe public void dengan nama checkRoute
60 Deklarasi dan instansiasi variabel bertipe array of integer dengan nama i dengan
panjang indeks array sama dengan nilai dari variabel jNode
61 Deklarasi dan instansiasi variabel bertipe array of Route dengan nama rute denagn
panjang indeks array 5
64 Deklarasi method bertipe public void nama addAdj dan berparameter int head, int
adj, int jarak
65 Deklarasi dan instansiasi variabel bertipe Node dengan nama n dengan parameter
node[head], adj, jarak
66 Memberikan nilai pada variabel node indeks ke-head denagn nilai n
67 Nilai varibel current ditambah 1
68 Nilai varibel dt1indeks ke [head][adj] ditambah 1
71 Deklarasi method bertipe public void dengan nama adjacency
72 Deklarasi variabel bertipe integer dengan nama i
73 Perintah mencetak baris kosong
74 Perulangan for dengan kondisi i = 0; i < jNode; i++
75 Mencetak nilai dari variabel i
77 Mencetak baris kosong
79 Perulangan for dengan kondisi i = 0; i < jNode; i++
80 Mencetak nilai dari variabel i
81 Perulangan for dengan kondisi int j = 0; j < jNode; j++
82 Deklarasi dan inisialisai variabel bertipe Node dengan nama n dengan nilai sama
dengan nilai dari variabel node indeks ke-i
83 Deklarasi dan inisialisai variabel bertipe boolean ketemu dengan nilai false
84 Perulangan while dengan kondisi n != null
85 Seleksi kodisi if dengan kondisi n.getData() == j
86 Perintah mencetak " 1 "
87 Memberikan nilai pada variabel ketemu dengan nilai true
88 Keluar dari seleksi kondisi
90 Memberikan nilai pada variabel n dengan nilai dari n.getNext()
92 Seleksi kondisi if dengan kondisi !ketemu
93 Perintah mencetak " 0 "
96 Perintah mencetak baris kosong
101 Deklarasi method bertipe public integer dengan nama edgeMasuk dan berparameter
int hitung.
102 Deklarasi dan inisialisai variabel bertipe integer dengan nama masuk dengan nilai 0
103 Perulangan for dengan kondisi int i = 0; i < jNode; i++
104 Deklarasi dan inisialisai variabel bertipe Node dengan nama nodeCari dengan nilai
sama dengan nilai dari variabel node indeks ke-i
105 Perulangan while dengan kondisi nodeCari != null
106 Seleksi kondisi if dengan kondisi hitung == nodeCari.getData()
107 Nilai variabel jml ditambah 1 diawal
109 Memberikan nilai pada variabel nodeCari dengan nilai dari nodeCari.getNext()
112 Mengembalikan nilai dari variabel masuk
116 Deklarasi method bertipe public integer dengan nama edgeKeluar dan berparameter
int indeks
117 Deklarasi dan inisialisai variabel bertipe integer dengan nama keluar dengan nilai 0
118 Deklarasi dan inisialisai variabel bertipe Node dengan nama nodeCari dengan nilai
sama dengan nilai dari variabel node indeks ke-indeks
119 Perulangan while dengan kondisi nodeCari != null
120 Nilai variabel jml ditambah 1 diawal
121 Memberikan nilai pada variabel nodeCari dengan nilai dari nodeCari.getNext()
123 Mengembalikan nilai dari variabel keluar
126 Deklarasi method bertipe public void dengan nama bfs
127 Perintah menetak "\nBreadth First Search : "
128 Deklarasi dan inisialisai variabel bertipe boolean cari dengan nilai false
129 Instansiasi variabel dt2 dengan panjang indeks array sama dengan nilai dari variabel
jNode
130 Inisialisai variabel dt2 indeks ke-0 dengan nilai 0
131 Perintah mencetak variabel dt2[0]
132 Deklarasi dan inisialisai variabel bertipe integer dengan nama Checkpoint dengan
nilai 1
133 Deklarasi dan inisialisai variabel bertipe integer dengan nama i dengan nilai 0
134 Deklarasi dan inisialisai variabel bertipe integer dengan nama p dengan nilai 1
135 Perulangan while dengan kondisi dt2[jNode - 1] == 0
136 Perulangan for dengan kondisi int j = 0; j < jNode; j++
137 Seleksi kondisi if dengan kondisi dt1[i][j] >= 1
138 Perulangan for dengan kondisi int f : dt2
139 Seleksi kondisi if dengan kondisi dt2[f] == j
140 Memberikan nilai pada variabel cari dengan nilai true
143 Seleksi kondisi if dengan kondisi cari != true
144 Memberikan nilai pada variabel dt2 indeks ke-Checkpoint dengan nilai j
145 Nilai Checkpoint ditambah 1
148 Memberikan nilai pada variabel ketemu dengan nilai false
150 Memberikan nilai pada variabel i dengan nilai dari dt2[p]
151 Nilai p ditambah 1
153 Perulangan for dengan kondisi int l = 1; l < jNode; l++
154 Mencetak " -> " dan dikonket dengan nilai dari dt2[l]
156 Mencetak baris kosong
158 Deklarasi dan inisialisasi variabel bertipe public integer dengan nama checkpoint
dengan nilai 1
159 Deklarasi dan inisialisasi variabel bertipe public boolean dengan nama find dengan
nilai false
161 Deklarasi method bertipe public void dengan nama dfs dan berparameter int i
162 Instansiasi variabel dt2 dengan panjang indeks sama dengan nilai dari jNode
163 Mencetak "Depth first search(%d) :\n" dengan nilai i
164 Memanggil method DFS dengan parameter 0
165 Mencetak nilai 0
166 Perulangan for dengan kondisi int w = 1; w < jNode; w++
167 Seleksi kondisi if dengan kondisi i == 0
168 Keluar dari perulangan
169 Seleksi kondisi else if dengan kondisi i != dt2[w]
170 Mencetak " -> " dan dikonket dengan nilai dari dt2[w]
171 Seleksi kondisi else if dengan kondisi i == dt2[w]
172 Mencetak " -> " dan dikonket dengan nilai dari dt2[w]
173 Keluar dari perulangan
176 Mencetak baris kosong
179 Deklarasi method bertipe public void dengan nama DFS dan berparameter int i
180 Deklarasi dan instansiasi variabel bertipe array of integer dengan nama S dengan
panjang indeks dengan nilai sam dengan nilai dari jNode + 1
181 Deklarasi dan inisialisasi variabel bertpe integer dengan nama s dengan nilai 0
182 Memberikan nilai pada variabel find dengan nilai false
184 Perulangan for dengan kondisi int j = 0; j < jNode; j++
185 Seleksi kondisi if dengan kondisi dt1[i][j] >= 1
186 Perulangan for dengan kondisi int w : dt2
187 Seleksi kondisi if dengan kondisi dt2[w] == j
188 Memberikan nilai pada variabel find dengan nilai true
191 Seleksi kondisi if dengan kondisi find != true
192 Memberikan nilai pada variabel S indeks ke-s dengan nilai dari variabel j
193 Nilai s ditambah 1
196 Memberikan nilai pada variabel find dengan nilai false
198 Perulangan for dengan kondisi int k = 0; k < jNode; k++
199 Perulangan for dengan kondisi int w = 0; w < jNode; w++
200 Seleksi kondisi if dengan kondisi S[k] == dt2[w]
201 Memberikan nilai pada variabel find dengan nilai true
204 Seleksi kondisi if dengan kondisi find != true
205 Memberikan nilai pada variabel dt2 indeks ke-checkpoint dengan nilai dari S[k]
206 Nilai checkpoint ditambah 1
209 Memanggil method DFS dengan parameter S[k]
210 Memberikan nilai pada variabel find dengan nilai false
214 Deklarasi method bertipe public integer dengan nama getCurent
215 Mencetak "Total " dan dikonket dengan nilai dari variabel current
216 Mengembalikan nilai dari variabel current
219 Deklarasi variabel bertipe public void dengan nama cetak
221 Perulangan for dengan kondisi int i = 0; i < jNode; i++
222 Mencetak "[" + i + "]"
Deklarasi dan inisialisasi variabel bertipe Node dengan nama n dengan nilai dari
223 node[i]
224 Perulangan while dengan kondisi n != null
226 Mencetak " " + "(Jarak = " + n.getJarak() + ")->" + n.getData()
227 Memberikan nilai pada variabel n dengan nilai dari n.getNext()
229 Mencetak baris kosong
233 Deklarasi method main
234 Deklarasi dan instansiasi variabel bertipe Graph dengan nama g dengan parameter 5
235 Memanggil method addAdj melalui objek g dengan parameter 0, 3, 1
236 Memanggil method addAdj melalui objek g dengan parameter 0, 1, 2
237 Memanggil method addAdj melalui objek g dengan parameter 1, 4, 4
238 Memanggil method addAdj melalui objek g dengan parameter 1, 2, 4
239 Memanggil method addAdj melalui objek g dengan parameter 2, 4, 8
240 Memanggil method addAdj melalui objek g dengan parameter 2, 1, 2
241 Memanggil method addAdj melalui objek g dengan parameter 4, 3, 3
242 Memanggil method cetak melalui objek g
243 Mencetak baris kosong
244 Mencetak "Graph Matrik Adjacency"
245 Memanggil method adjacency melalui objek g
246 Mencetak baris kosong
247 Memanggil method getCurent melalui objek g
248 Mencetak "Vertex 0 edge masuk %d edge keluar %d \n" dengan nilai dari method
249 edgeMasuk dengan parameter 0 dan method edgeKeluar dengan parameter 0
250 Mencetak "Vertex 1 edge masuk %d edge keluar %d \n" dengan nilai dari method
251 edgeMasukdengan parameter 1 dan method edgeKeluar dengan parameter 1
252 Mencetak "Vertex 2 edge masuk %d edge keluar %d \n" dengan nilai dari method
253 edgeMasuk dengan parameter 2 dan method edgeKeluardengan parameter 2
254 Mencetak "Vertex 3 edge masuk %d edge keluar %d \n" dengan nilai dari method
255 edgeMasuk dengan parameter 3 dan method edgeKeluardengan parameter 3
256 Mencetak "Vertex 4 edge masuk %d edge keluar %d \n" dengan nilai dari method
257 edgeMasuk dengan parameter 4 dan method edgeKeluardengan parameter 4
258 Memanggil method bfs melalui objek g
259 Mencetak baris kosong
260 Memanggil method dfs melalui objek g dengan parameter 4
D. SCREENSHOT PROGRAM

E. KESIMPULAN

Dalam bidang matematika dan ilmu komputer, teori graf mempelajari tentang graf
yaitu struktur yang menggambarkan relasi antar objek dari sebuah koleksi objek. Definisi
dari suatu graf adalah himpunan bendabenda yang disebut verteks (atau node) yang
terhubung oleh sisi (atau edge atau arc). Biasanya graf digambarkan sebagai kumpulan
titik-titik (melambangkan verteks) yang dihubungkan oleh garis‑garis (melambangkan
sisi).
Struktur data graf merupakan bentuk implementasi dari teori graf yang mencakup
definisi, dan hukum‑hukum yang menyertainya. Struktur data graf menggunakan
representasi internal senarai ketetanggaan dengan alasan efisiensi penggunaan untuk
komputasi, karena penggunaan matriks ketetanggan kurang
efisisen dan cenderung boros untuk kasus jumlah sisi sedikit sedangkan matriks
ketetanggaan yang dibentuk berupa matriks jarang (sparse).

Implementasi struktur data graf dalam bahasa pemograman java adalah berupa
kelas bernama graph sebagai berikut :

public class Graph


{
protected HashMap adjacencyMap;
/**
* insialisasi Graf, membuat adjacency map
*/
public Graph()
{
adjacencyMap = new HashMap()
}
/**
* Memeriksa apakah Graf mengandung simpul
*
*@return true – jika tidak mengandung simpul kosong.
*/
public boolean isEmpty()
{
return adjacencyMap.isEmpty();
}
/**
* Mengembalikan jumlah simpul induk dalam graf
*/
public int size()
{
return adjacencyMap.size();
}
/**
* Mengembalikan jumlah sisi dalam graf
*/
public int getEdgeCount()
{
int count = 0;
for (inti=0;i<adjacencyMap.CAPACITY;i++){
if (adjacencyMap.keys[i] != null){
LinkedList edges = (LinkedList)
adjacencyMap.get(adjacencyMap.keys[i]);
count += edges.size();
}
}
return count;
}
/**
* Menambahkan sebuah objek sebagai simpul
* @param vertex – the specified object
* @return true – jika berhasil ditambahkan
*/
public boolean addVertex (Object vertex)
{
if (adjacencyMap.containsKey(vertex))
return false;
adjacencyMap.put (vertex, new
LinkedList());
return true;
}
/**
public boolean addEdge (Object v1, Object v2)
{
addVertex (v1); addVertex (v2);
LinkedList l = (LinkedList)
adjacencyMap.get(v1);
l.add(v2);
return true;
}
}

Anda mungkin juga menyukai