Anda di halaman 1dari 10

Laporan Tugas Kecil II

IF 2211 Strategi Algoritma

Penyelesaian Lonely Island dengan Decrease and Conquer

Disusun oleh:

Josep Andre Ginting


13517108

PROGRAM STUDI TEKNIK INFORMATIKA


SEKOLAH TEKNIK ELEKTRO DAN INFORMATIKA
INSTITUT TEKNOLOGI BANDUNG
2019
BAB I
DESKRIPSI MASALAH

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.

IF2211 Strategi Algoritma | 2


BAB II
ALGORITMA DECREASE AND CONQUER

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

IF2211 Strategi Algoritma | 3


BAB III
SOURCE CODE PROGRAM

Source Code dalam Bahasa Java

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.*;

public class LonelyIsland implements Runnable {

static class Graph{


int vertices;
LinkedList<Integer>[] pList;
List<Integer> terjebak = new ArrayList<>();

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);
}

public void printGraph(){


for (int i = 0; i<vertices ; i++) {
if(pList[i].size()>0) {
System.out.println("Pulau " + i + " terhubung ke: ");
for (int j = 0; j < pList[i].size(); j++) {
System.out.print(pList[i].get(j) + " ");
}
System.out.println();
}
}
}

IF2211 Strategi Algoritma | 4


public void printHasil(int s, int[][] jembatan, int j){
terjebak.remove(new Integer(s));
for(int i=0; i<j; i++){
if(terjebak.contains(jembatan[i][0])){
terjebak.remove(new Integer(jembatan[i][0]));
}
}
for(int k=0; k<j; k++){
if(jembatan[k][0]==s){
int q = jembatan[k][1];
for(int l=0; l<j; l++){
if(jembatan[l][0]==q && jembatan[l][1]==s){
terjebak.add(q);
}
}
}
}

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));
}

System.out.println("Jalur yang dilewati :");


for(int h=0; h<terjebak.size(); h++){
boolean[] lewat = new boolean[vertices];
int jl = terjebak.get(h);
jalur(s,lewat,jl);
}
}

public void Telusuri(int pulauAwal){


boolean[] visited = new boolean[vertices];
hasil(pulauAwal, visited);
}

IF2211 Strategi Algoritma | 5


public void hasil(int pAwal, boolean[] visited){
visited[pAwal] = true;
//System.out.print(pAwal + " ");
if(!terjebak.contains(pAwal)){
terjebak.add(pAwal);
}
for (int i = 0; i<pList[pAwal].size(); i++) {
int nextp = pList[pAwal].get(i);
if(pList[nextp] != null){
if(!visited[nextp]){
hasil(nextp,visited);
}
}
}
}

public void jalur(int pAwal, boolean[] visited, int tujuan){


if(pAwal!=tujuan){
visited[pAwal] = true;
System.out.print(pAwal + "->");
for(int i=0; i<pList[pAwal].size(); i++){
int nextp = pList[pAwal].get(i);
if(!visited[nextp]){
if(nextp!=tujuan && pList[nextp]!=null){
jalur(nextp,visited,tujuan);
}else{
System.out.println(tujuan);
return;
}
}
}
}
}
}

public void run(){}

public static void main(String[] args) {


new Thread(null, new LonelyIsland(), "lalala", 1 << 100000).start();
long start = System.nanoTime();

String file = "test.txt";


String[] tab;
int p,j,s;

IF2211 Strategi Algoritma | 6


try {
File f = new File(file);
Scanner in = new Scanner(f);

tab = in.nextLine().split(" ");


p = Integer.parseInt(tab[0]);
j = Integer.parseInt(tab[1]);
s = Integer.parseInt(tab[2]);

int nPulau = p+1;


Graph graph = new Graph(nPulau);
int[][] jembatan = new int[j][2];
for (int i=0; i<j; i++){
String x[] = in.nextLine().split(" ");
int a = Integer.parseInt(x[0]);
int b = Integer.parseInt(x[1]);
jembatan[i][0] = Integer.parseInt(x[0]);
jembatan[i][1] = Integer.parseInt(x[1]);
graph.addEgde(a,b);
}

graph.Telusuri(s);
graph.printHasil(s,jembatan,j);

long end = System.nanoTime();


long selisih = end - start;
double seconds = (double)selisih / 1_000_000_000.0;
System.out.println("Waktu : " + seconds + " detik");
}
catch (FileNotFoundException fnfe) {
fnfe.getMessage();
}
}
}

IF2211 Strategi Algoritma | 7


BAB IV
HASIL EKSPERIMEN

1. Untuk m=7 dan n=5

2. Untuk m=5 dan n=7

IF2211 Strategi Algoritma | 8


3. Untuk m=12 dan n=12

4. Untuk m=15 dan n=17

IF2211 Strategi Algoritma | 9


5. Untuk m=20000 dan n=20000

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 

IF2211 Strategi Algoritma | 10

Anda mungkin juga menyukai