MODUL XI : GRAPH
Disusun Oleh:
Nama : Febri Yolanda Silalahi
NIM : 21103016
Kelas : S1SI 05-A
Jika setiap busur mempunyai nilai yang menyatakan hubungan antara 2 buah simpul, maka busur
tersebut dinyatakan memiliki bobot.
Representasi Graph
Yang perlu diperhatikan dalam membuat representasi graph dalam bentuk linked list adalah kita
perlu membedakan antara simpul vertex dengan simpul edge. Simpul vertex menyatakan simpul
atau vertex dan simpul edge menyatakan busur (hubungan antar simbol). Struktur keduanya bisa
sama bisa juga berbeda tergantung kebutuhan, namun biasanya disamakan. Yang membedakan
antara simpul vertex dengan simpul edge nantinya adalah anggapan terhadap simpul tersebut
juga fungsinya masing-masing.
Graph berbobot (weighted graph)
Apabila sisi-sisi pada graph disertai juga dengan suatu (atau beberapa) harga yang menyatakan
secara unik kondisi keterhubungan tersebut maka graph tersebut disebut graph berbobot. Dalam
pembahasan algoritma-algoritma graph nanti pengertian bobot akan menggunakan pengertian
biaya sehingga apabila diaplikasikan pada masalah yang berpengertian laba maka kuantitas-
kuantitas terkait adalah kebalikannnya. Misalnya mencari jarak tempuh minimum digantikan
dengan mencari laba maksimum.
Algoritma Djikstra
Pada setiap langkah, ambil sisi yang berbobot minimum yang menghubungkan sebuah simpul
yang telah dikunjungi dengan sebuah simpul lain yang belum dikunjungi. Lintasan dari simpul
asal ke simpul yang baru haruslah merupakan lintasan yang terpendek diantara semua
lintasannya ke simpul-simpul yang belum dikunjungi. Algoritma Djikstra ditemukan oleh Edger
W. Dijkstra (1930–2002), merupakan salah seorang anggota yang paling berpengaruh dari
generasi penemu ilmu komputer. Langkah-langkah algoritma dijkstra adalah sebagai berikut:
1. Berikan nilai bobot untuk setiap titik ke titik lainnya, berikan nilai 0 pada node awal dan nilai
tak hingga terhadap node lain (yang belum terisi).
2. Atur semua node dengan label “Belum dikunjungi” dan atur node awal sebagai “Node
keberangkatan”
3. Dari node keberangkatan, pertimbangkan node tetangga yang belum terjamah dan hitung
jaraknya dari titik keberangkatan. Sebagai contoh, jikatitik keberangkatan X ke Y memiliki
bobot jarak 7 dan dari Y ke node Z berjarak 13, maka jarak ke Z melewati Y menjadi 7+13=20.
Jika jarak ini lebih kecil dari jarak sebelumnya (yang telah terekam sebelumnya) hapus data
lama, simpan ulang data jarak dengan jarak yang baru.
4. Saat kita selesai mempertimbangkan setiap jarak terhadap node tetangga, tandai node yang
telah terjamah sebagai “Node dikunjungi”. Node yang telah dikunjungi tidak akan pernah di cek
kembali, jarak yang disimpan adalah jarak terakhir dan yang paling minimal bobotnya.
5. Set “node belum dikunjungi” dengan jarak terkecil (dari node asal) sebagai “node asal”
selanjutnya, kemudian lanjutkan dengan mengulang Langkah 3.
Algoritma Flyod Warshall
Algoritma pencarian terpendek Flyod Warshall melakukan perbandingan jarak/bobot semua
simpul sehingga hasil dari perhitungan algoritma ini adalah lintasan terpendek untuk semua
pasangan simpul yang terdapat pada graph. Kelebihan dari algoritma ini yakni dapat diterapkan
meskipun nilai jarak/bobot suatu busur/edge negatif berbeda dengan algoritma Djikstra yang
hanya dapat digunakan pada graph yang bernilai positif untuk semua / bobot busurnya.Langkah
awal dalam menerapkan algoritma ini untuk menemukan lintasan dari sebuah graph adalah
dengan membuat representasi graph dalam bentuk matrik adjacency. Graph dalam bentuk matrik
tersebut yang kemudian diproses. Algoritma Flyod Warshall merupakan algoritma yang bersifat
iteratif, jumlah proses iterasi yang mungkin terjadi sebanyak jumlah simpul pangkat 3 (n^3),
sehingga apabila terdapat 7 simpul maka akan terjadi perulangan.
Contoh program
#include <stdio.h>
#include <iostream>
using namespace std;
int ordo[5][5];
void masukkan(int a, int b, int c){
for (int i = 1; i <= 4; i++){
for (int j = 1; j <= 4; j++)
if (i == a && j == b){
ordo[a][b] = ordo[i][j];
ordo[a][b] = c;
}
}
}
void tampilkan(int a, int b, int c){
for (int i = 1; i <= 4; i++){
for (int j = 1; j <= 4; j++)
cout << ordo[i][j] << " ";
cout << endl;
}
}
void inisialisasi(){
for (int i = 1; i <= 4; i++){
for (int j = 1; j <= 4; j++)
ordo[i][j] = 0;
}
}
void menu(){
cout << "-----------------MENU-----------------\n";
cout << "1. Masukkan Data\n";
cout << "2. Tampilkan\n";
cout << "0. Keluar\n";
cout << "Masukkan Pilihan Anda: ";
}
int main(){
inisialisasi();
int a, b, c;
int m;
do{
system("cls");
menu();
cin >> m;
switch (m){
case 1:
system("cls");
cout << "\nMasukkan Koordinat x : ";
cin >> a;
cout << "Masukkan Koordinat y : ";
cin >> b;
cout << "Masukkan Isi : ";
cin >> c;
if (a <= 4 && b <= 4){
masukkan(a, b, c);
}
else{
cout << "\nIndeks harus kurang dari 4\n";
}break;
system("pause");
case 2:system("cls");
tampilkan(a, b, c); break;
system("pause");
}system("pause");
} while (m != 0);
}
GUIDED
1. Latihan 1
Berdasarkan ilustrasi graph berarah dan berbobot yang ditunjukkan pada
gambar 05, buatlah repsentasinya dalam bentuk matriks
Penjelasan:
- Jarak dari Bandung ke Bandung adalah 0 km
- Jarak dari Bandung ke Bekasi adalah 5 km
- Jarak dari Bandung ke Jakarta adalah 0 km
- Jarak dari Bandung ke Purwokerto adalah 15 km
- Jarak dari Bandung ke Semarang adalah 0 km
- Jarak dari Bandung ke Tasikmalaya adalah 0 km
- Jarak dari Bandung ke Yogyakarta adalah 0 km
- Jarak dari Bekasi ke Bandung adalah 6 km
- Jarak dari Bekasi ke Bekasi adalah 0 km
- Jarak dari Bekasi ke Jakarta adalah 0 km
- Jarak dari Bekasi ke Purwokert adalah 0 km
- Jarak dari Bekasi ke Semarang adalah 5 km
- Jarak dari Bekasi ke Tasikmalaya adalah 0 km
- Jarak dari Bekasi ke Yogyakarta adalah 0 km
- Jarak dari Jakarta ke Bandung adalah 7 km
- Jarak dari Jakarta ke Bekasi adalah 8 km
- Jarak dari Jakarta ke Jakarta adalah 0 km
- Jarak dari Jakarta ke Purwokerto adalah 0 km
- Jarak dari Jakarta ke Semarang adalah 0 km
- Jarak dari Jakarta ke Tasikmalaya adalah 0 km
- Jarak dari Jakarta ke Yogyakarta adalah 0 km
- Jarak dari Purwokerto ke Bandung adalah 0 km
- Jarak dari Purwokerto ke Bekasi adalah 0 km
- Jarak dari Purwokerto ke Jakarta adalah 0 km
- Jarak dari Purwokerto ke Purwokerto adalah 0 km
- Jarak dari Purwokerto ke Semarang adalah 7 km
- Jarak dari Purwokerto ke Tasikmalaya adalah 0 km
- Jarak dari Purwokerto ke Yogyakarta adalah 3 km
- Jarak dari Semarang ke Bandung adalah 0 km
- Jarak dari Semarang ke Baekasi adalah 0 km
- Jarak dari Semarang ke Jakarta adalah 23 km
- Jarak dari Semarang ke Purwokerto adalah 0 km
- Jarak dari Semarang ke Semarang adalah 0 km
- Jarak dari Semarang ke Tasikmalaya adalah 10 km
- Jarak dari Semarang ke Yogyakarta adalah 8 km
- Jarak dari Tasikmalaya ke Bandung adalah 5 km
- Jarak dari Tasikmalaya ke Bekasi adalah 0 km
- Jarak dari Tasikmalaya ke Jakarta adalah 0 km
- Jarak dari Tasikmalaya ke Purwokerto adalah 4 km
- Jarak dari Tasikmalaya ke Semarang adalah 0 km
- Jarak dari Tasikmalaya ke Tasikmalaya adalah 0 km
- Jarak dari Tasikmalaya ke Yogyakarta adalah 0 km
- Jarak dari Yogyakarta ke Bandung adalah 0 km
- Jarak dari Yogyakarta ke Bekasi adalah 0 km
- Jarak dari Yogyakarta ke Jakarta adalah 0 km
- Jarak dari Yogyakarta ke Purwokerto adalah 4 km
- Jarak dari Yogyakarta ke Semarang adalah 9 km
- Jarak dari Yogyakarta ke Tasikmalaya adalah 0 km
- Jarak dari Yogyakarta ke Yogyakarta adalah 0 km
2. Latihan 2
Berdasarkan tugas guided II, buatlah program dari untuk menghasilkan representasi
dalam bentuk matriks.
void tampilGraph(){
if(simpul && busur){
for(int baris = 0; baris < 7; baris++){
cout<<simpul[baris]<<" : ";
for(int kolom = 0; kolom < 7; kolom++){
if(busur[baris][kolom] != 0){
cout<<simpul[kolom]<<"("<<busur[baris][kolom]<<")"<<" ";
}
}
cout<<endl;
}
}
}
int main(){
tampilGraph();
return 0;
}
Running Program
Penjelasan :
Dalam source code sudah dimasukkan data data, jadi tidak perlu untuk mengimput data
lagi. Jika dijalankan, hasil akan seperti gambar di atas.
int jumlahSimpul = 5;
string *dataSimpul;
int **dataBusur;
bool cekMatrik = false;
void buatMatriks(){
dataSimpul = new string[jumlahSimpul];
//Membuat simpul dengan jumlah yang dimasukkan user
cekMatrik = true;
//Atur keberadaan matrik menjadi ada/true
}
void tampilMatriks(){
if(cekMatrik){
for(int i = 0; i < jumlahSimpul; i++){
cout<<dataSimpul[i]<<" ";
}
cout<<endl;
for(int baris = 0; baris < jumlahSimpul; baris++){
for(int kolom = 0; kolom < jumlahSimpul; kolom++){
cout<<dataBusur[baris][kolom]<<" ";
}
cout<<endl;
}
}else{
cout<<"Tidak ada matriks"<<endl;
}
}
int main(){
cout<<"Silahkan masukkan jumlah simpul : ";
cin>>jumlahSimpul;
buatMatriks();
tampilMatriks();
return 0;
}
Running Program
Penjelasan:
Dalam program ini, kita menginput data karena dalam source code tidak dibuat syntax
data-data, tetapi syntaxnya adalah penginputan data oleh user. Jadi ketika program
dijalankan, maka kita dapat menginput data-data yang diminta.
3. Latihan 3
Berdasarkan ilustrasi graph berarah dan berbobot yang ditunjukkan pada gambar 05,
buatlah repsentasinya dalam bentuk linked list
Penjelasan:
- Jarak dari Bandung ke Bandung adalah 0 km
- Jarak dari Bandung ke Bekasi adalah 5 km
- Jarak dari Bandung ke Jakarta adalah 0 km
- Jarak dari Bandung ke Purwokerto adalah 15 km
- Jarak dari Bandung ke Semarang adalah 0 km
- Jarak dari Bandung ke Tasikmalaya adalah 0 km
- Jarak dari Bandung ke Yogyakarta adalah 0 km
- Jarak dari Bekasi ke Bandung adalah 6 km
- Jarak dari Bekasi ke Bekasi adalah 0 km
- Jarak dari Bekasi ke Jakarta adalah 0 km
- Jarak dari Bekasi ke Purwokert adalah 0 km
- Jarak dari Bekasi ke Semarang adalah 5 km
- Jarak dari Bekasi ke Tasikmalaya adalah 0 km
- Jarak dari Bekasi ke Yogyakarta adalah 0 km
- Jarak dari Jakarta ke Bandung adalah 7 km
- Jarak dari Jakarta ke Bekasi adalah 8 km
- Jarak dari Jakarta ke Jakarta adalah 0 km
- Jarak dari Jakarta ke Purwokerto adalah 0 km
- Jarak dari Jakarta ke Semarang adalah 0 km
- Jarak dari Jakarta ke Tasikmalaya adalah 0 km
- Jarak dari Jakarta ke Yogyakarta adalah 0 km
- Jarak dari Purwokerto ke Bandung adalah 0 km
- Jarak dari Purwokerto ke Bekasi adalah 0 km
- Jarak dari Purwokerto ke Jakarta adalah 0 km
- Jarak dari Purwokerto ke Purwokerto adalah 0 km
- Jarak dari Purwokerto ke Semarang adalah 7 km
- Jarak dari Purwokerto ke Tasikmalaya adalah 0 km
- Jarak dari Purwokerto ke Yogyakarta adalah 3 km
- Jarak dari Semarang ke Bandung adalah 0 km
- Jarak dari Semarang ke Baekasi adalah 0 km
- Jarak dari Semarang ke Jakarta adalah 23 km
- Jarak dari Semarang ke Purwokerto adalah 0 km
- Jarak dari Semarang ke Semarang adalah 0 km
- Jarak dari Semarang ke Tasikmalaya adalah 10 km
- Jarak dari Semarang ke Yogyakarta adalah 8 km
- Jarak dari Tasikmalaya ke Bandung adalah 5 km
- Jarak dari Tasikmalaya ke Bekasi adalah 0 km
- Jarak dari Tasikmalaya ke Jakarta adalah 0 km
- Jarak dari Tasikmalaya ke Purwokerto adalah 4 km
- Jarak dari Tasikmalaya ke Semarang adalah 0 km
- Jarak dari Tasikmalaya ke Tasikmalaya adalah 0 km
- Jarak dari Tasikmalaya ke Yogyakarta adalah 0 km
- Jarak dari Yogyakarta ke Bandung adalah 0 km
- Jarak dari Yogyakarta ke Bekasi adalah 0 km
- Jarak dari Yogyakarta ke Jakarta adalah 0 km
- Jarak dari Yogyakarta ke Purwokerto adalah 4 km
- Jarak dari Yogyakarta ke Semarang adalah 9 km
- Jarak dari Yogyakarta ke Tasikmalaya adalah 0 km
- Jarak dari Yogyakarta ke Yogyakarta adalah 0 km
4. Latihan 4
Berdasarkan tugas guided III, buatlah program untuk menghasilkan representasi graph
dalam bentuk linked list
Source Code
#include <iostream>
#include <string>
int jumlahSimpul = 5;
string *dataSimpul;
int **dataBusur;
bool cekMatrik = false;
struct graph{
graph *kanan;
string data;
graph *kiri;
};
graph *simpul;
graph *busur;
graph *awal;
graph *akhir;
graph **alamat;
graph *helperA;
graph *helperB;
void inisiasi(){
awal = NULL;
akhir = NULL;
}
bool graphKosong(){
if(awal == NULL && akhir == NULL){
return true;
}else{
return false;
}
}
void buatMatriks(){
dataSimpul = new string[jumlahSimpul];
dataBusur = new int*[jumlahSimpul];
dataBusur[0] = new int[jumlahSimpul * jumlahSimpul];
for(int i = 1; i < jumlahSimpul; i++){
dataBusur[i] = dataBusur[i-1] + jumlahSimpul;
}
cout<<"Silahkan masukkan nama simpul "<<endl;
for(int i = 0; i < jumlahSimpul; i++){
cout<<"Kota "<<i+1<<" : ";
cin>>dataSimpul[i];
}
cout<<"Silahkan masukkan bobot antar simpul "<<endl;
for(int baris = 0; baris < jumlahSimpul; baris++){
for(int kolom = 0; kolom < jumlahSimpul; kolom++){
cout<<dataSimpul[baris]<<" --> "<<dataSimpul[kolom]<<" : ";
cin>> dataBusur[baris][kolom];
}
}
cekMatrik = true;
}
void buatSimpulGraph(){
alamat = new graph*[jumlahSimpul];
// Membuat pointer alamat sebanyak jumlah simpul
buatMatriks();
for(int i = 0; i < jumlahSimpul; i++){
if(graphKosong()){
simpul = new graph;
simpul->data = dataSimpul[i];
simpul->kanan = NULL;
simpul->kiri = NULL;
awal = simpul;
akhir = simpul;
alamat[i] = awal; // Simpan alamat simpul
}else{
simpul = new graph;
simpul->data = dataSimpul[i];akhir->kiri = simpul;
akhir = simpul;
simpul->kiri = NULL;
simpul->kanan = NULL;
alamat[i] = akhir;
}
}
helperA = awal;
for(int baris = 0; baris < jumlahSimpul; baris++){
helperB = helperA;
for(int kolom = 0; kolom < jumlahSimpul; kolom++){
if(dataBusur[baris][kolom] != 0){
simpul = new graph;
simpul->data = to_string(dataBusur[baris][kolom]);
helperB->kanan = simpul;
simpul->kiri = alamat[kolom];
simpul->kanan = NULL;
helperB = simpul;
}
}
helperA = helperA->kiri;
}
}
void tampilGraph(){
if(!graphKosong()){
helperA = awal;
while(helperA != NULL){
cout<<helperA->data<<" : ";
helperB = helperA->kanan;
while(helperB != NULL){
cout<<helperB->kiri->data<<" : "<<helperB->data<<" ";
helperB = helperB->kanan;
}
cout<<endl;
helperA = helperA->kiri;
}
}else{
cout<<"Graph kosong...!!!"<<endl;
}
}
int main(){
inisiasi();
cout<<"Silahkan masukkan jumlah kota : ";
cin>>jumlahSimpul;
buatSimpulGraph();
tampilGraph();
return 0;
}
Running Program
Penjelasan:
Dalam program, kita disuruh menginput data sesuai dengan yang diminta. Untuk
pengisian data (penginputan data), kita bisa memasukkan data-data yang ada dalam
guided 3.
UNGUIDED
1. Latihan 1
Jelaskan dengan gambar urutan setiap proses yang terjadi ketika fungsi
buatSimpulGraph() pada tugas guided IV dijalankan.
int jumlahSimpul = 5;
string *dataSimpul;
int **dataBusur;
bool cekMatrik = false;
struct graph{
graph *kanan;
string data;
graph *kiri;
};
graph *simpul;
graph *busur;
graph *awal;
graph *akhir;
graph **alamat;
graph *helperA;
graph *helperB;
void inisiasi(){
awal = NULL;
akhir = NULL;
}
bool graphKosong(){
if(awal == NULL && akhir == NULL){
return true;
}else{
return false;
}
}
void buatMatriks(){
dataSimpul = new string[jumlahSimpul];
dataBusur = new int*[jumlahSimpul];
dataBusur[0] = new int[jumlahSimpul * jumlahSimpul];
for(int i = 1; i < jumlahSimpul; i++){
dataBusur[i] = dataBusur[i-1] + jumlahSimpul;
}
cout<<"Silahkan masukkan nama simpul "<<endl;
for(int i = 0; i < jumlahSimpul; i++){
cout<<"Kota "<<i+1<<" : ";
cin>>dataSimpul[i];
}
cout<<"Silahkan masukkan bobot antar simpul "<<endl;
for(int baris = 0; baris < jumlahSimpul; baris++){
for(int kolom = 0; kolom < jumlahSimpul; kolom++){
cout<<dataSimpul[baris]<<" --> "<<dataSimpul[kolom]<<" : ";
cin>> dataBusur[baris][kolom];
}
}
cekMatrik = true;
}
void buatSimpulGraph(){
alamat = new graph*[jumlahSimpul];
// Membuat pointer alamat sebanyak jumlah simpul
buatMatriks();
for(int i = 0; i < jumlahSimpul; i++){
if(graphKosong()){
simpul = new graph;
simpul->data = dataSimpul[i];
simpul->kanan = NULL;
simpul->kiri = NULL;
awal = simpul;
akhir = simpul;
alamat[i] = awal; // Simpan alamat simpul
}else{
simpul = new graph;
simpul->data = dataSimpul[i];akhir->kiri = simpul;
akhir = simpul;
simpul->kiri = NULL;
simpul->kanan = NULL;
alamat[i] = akhir;
}
}
helperA = awal;
for(int baris = 0; baris < jumlahSimpul; baris++){
helperB = helperA;
for(int kolom = 0; kolom < jumlahSimpul; kolom++){
if(dataBusur[baris][kolom] != 0){
simpul = new graph;
simpul->data = to_string(dataBusur[baris][kolom]);
helperB->kanan = simpul;
simpul->kiri = alamat[kolom];
simpul->kanan = NULL;
helperB = simpul;
}
}
helperA = helperA->kiri;
}
}
void tampilGraph(){
if(!graphKosong()){
helperA = awal;
while(helperA != NULL){
cout<<helperA->data<<" : ";
helperB = helperA->kanan;
while(helperB != NULL){
cout<<helperB->kiri->data<<" : "<<helperB->data<<" ";
helperB = helperB->kanan;
}
cout<<endl;
helperA = helperA->kiri;
}
}else{
cout<<"Graph kosong...!!!"<<endl;
}
}
void jalurPendek(){
string newhelper,asal,tujuan;
int a=0;if(!graphKosong()){
cout<< "Masukkan Daerah Asal : ";cin>>asal;
cout<< "Masukkan Daerah Tujuan : ";cin>>tujuan;
helperA = awal;
while(helperA != NULL){
if (helperA->data==asal){
break;
}else{
helperA = helperA->kiri;
}
}
while(helperA->data != tujuan){
if(a!=0){
cout<<asal<<" : ";
}
cout<<helperA->data<<" : ";
helperB = helperA->kanan;
while(helperB != NULL){
if(helperB->kiri->data==tujuan){
cout<<helperB->kiri->data<<" : "<<helperB->data<<" ";
}
helperB = helperB->kanan;
}
cout<<endl;
helperA = helperA->kiri;
a=a+1;
}
}else{
cout<<"Graph kosong...!!!"<<endl;
}
}
int main(){
inisiasi();
cout<<"Silahkan masukkan jumlah kota : ";
cin>>jumlahSimpul;
buatSimpulGraph();
tampilGraph();
cout<<endl;
jalurPendek();
return 0;
}
Running Program
Penjelasan:
Dalam program, kita disuruh menginput data sesuai dengan yang diminta. Untuk
pengisian data (penginputan data), kita bisa memasukkan data-data yang ada dalam
guided yang sebelumnya. Yaitu jumlah kota sebanyak 7, setelah itu kita masukkan
jarak antar kota sesuai dengan data yang sudah ada. Jika sudah diisi, maka akan
muncul jarak dari kota yang sat uke kota yang lainnya. Dan setelah itu, kita disuruh
menginput daerah asal dan daerah tujuan, maka akan muncul jarak terdekat dari
daerah asal ke daerah tujuan, missal untuk melihat jarak antara kota Bandung dan
Yogyakarta, maka jaraknya ada sejauh 3 km dan 8 km.
SUMBER
https://brawlyvonfabre.blogspot.com/p/graph.html
https://galehfatmaea.blogspot.com/2014/05/graph-c.html
https://bocahngoding.blogspot.com/2018/01/pengertian-dan-penjelasan-tentang-
garph.html
PENGALAMAN BELAJAR
Dalam pembelajaran materi kali ini yaitu tentang graph kita dapat mencari berapa nilai
terpendek dari simpul asal ke simpul yang lain. Tidak hanya itu, graph juga bisa digambarkan
menjadi bentuk djikstra, flyod warshall, linkedlist.
Dalam praktikum ini saya bisa mengerti atau bisa dibilang sudah lumayan paham
bagaimana penerapan graph. Untuk melihat jarak terpendek,jarak simpul A ke simpul B, dan lain
sebagainya.