Disusun oleh:
Tugas Kecil Strategi Algoritma ini memiliki tujuan membuat program mengetahui di pulau mana
saja pemain dapat terjebak menggunakan pendekatan Decrease and Conquer. Pulau-pulau tersebut,
terhubung dengan jembatan-jembatan yang hanya bisa digunakan untuk satu arah. Jika sebuah jembatan
menghubungkan pulau a dan pulau b, maka jembatan tersebut hanya bisa digunakan untuk menyeberang
dari pulau a ke pulau b, dan tidak sebaliknya. Jika sedang berada di pulau a, maka bisa dipilih sebuah pulau
lain secara random yang terhubung langsung dengan pulau a melalui jembatan satu arah, dan melakukan
gerakan berpindah ke pulau tersebut. Pemain akan terjebak pada suatu pulau jika tidak bisa berpindah ke
pulau lain, karena dalam persoalan ini, setelah meninggalkan pulau maka tidak bisa kembali ke pulau yang
ditinggalkan.
Input dari persoalan ini adalah sebuah berkas teks dengan ketentuan sebagai berikut.
1. Baris pertama: tiga buah bilangan integer:
n (banyaknya pulau); m(banyaknya jembatan); r (indeks pulau posisi awal pemain);
2. Sejumlah m baris berikutnya (banyaknya jembatan), setiap baris berisi dua buah integer:
𝑢𝑖 dan 𝑣𝑖; yang merepresentasikan jembatan satu arah dari pulau 𝑢𝑖 ke pulau 𝑣𝑖.
Batasan dari input adalah sebagai berikut:
- 1 ≤ n ≤ 200.000
- 1 ≤ m ≤ 500.000
- 1 ≤ 𝑢𝑖 , 𝑣𝑖, r ≤ n
Luaran dari program adalah pulau di mana pemain bisa terjebak, jika lebih dari satu pulau tampilkan dari
pulau dengan indeks terkecil lebih dulu.
Sebagai contoh, terdapat berkas teks masukan dengan isi sebagai berikut.
571
12
13
14
15
24
25
34
Maka luaran dari program adalah pemain bisa terjebak di pulau 4 atau pulau 5.
Langkah-langkah :
1. Input dari file eksternal yaitu jembatan penghubung antar pulau akan dimasukkan
kedalam graf berarah, dengan pulau menjadi simpul (vertex) dan jembatan menjadi sisi
(edge).
2. Mulai menelusuri graf dari pulau/vertex pertama berdasarkan input hingga menelusuri
semua pulau yang ada berdasarkan masukan dari file eksternal.
3. Decreas digunakan pada saat suatu pulau sudah dikunjungi dengan sebuah jembatan,
maka Pulau yang pernah dikunjungi tersebut akan ditandai menggunakan array visited,
jika sudah pernah dikunjungi, maka nilai array visited di indeks yang sama dengan
indeks pulau akan di set menjadi true sebagai penanda bahwa pulau sudah pernah
dikunjungi, sehingga jika sudah pernah dikunjungi, maka tidak akan dilakukan lagi
proses penelusuran, karena tidak mungkin bisa kembali ke pulau yang sudah pernah
dikunjungi tersebut.
4. Conquer digunakan untuk menggabungkan semua kemungkinan hasil yang ditemukan di
pulau mana saja bisa bisa terjebak setelah melakukan penelusuran.
5. Semua hasil pulau yang memungkinkan terjebak akan disimpan ke array, jika didalam
array sudah ada indeks pulau, maka tidak akan ditambahkan lagi
import java.util.*;
import java.util.Scanner;
import java.io.File;
import java.io.IOException;
import java.io.FileNotFoundException;
import java.io.File;
import java.lang.*;
Graph(int vertices){
this.vertices = vertices;
pList = new LinkedList[vertices];
for (int i = 0; i <vertices ; i++) {
pList[i] = new LinkedList<>();
}
}
public void addEgde(int asal, int tujuan){
pList[asal].addFirst(tujuan);
}
Collections.sort(terjebak);
if(terjebak.size()>1){
System.out.print("Pemain bisa terjebak di pulau " + terjebak.get(0));
for(int z=1; z<terjebak.size()-1; z++){
System.out.print(", " + terjebak.get(z) );
}
System.out.println(" dan " + terjebak.get(terjebak.size()-1));
}else if (terjebak.size()==1){
System.out.println("Pemain bisa terjebak di pulau " + terjebak.get(0));
}
graph.Telusuri(s);
graph.printHasil(s,jembatan,j);
Poin Ya Tidak
1. Program berhasil dikompilasi
2. Program berhasil dieksekusi
3. Program dapat menerima input dan menuliskan input
4. Program sudah benar untuk semua n yang