GRAF
Implementasi & Studi Kasus
Graf (Graph)
Memahami struktur data non-linear Graf: konsep dasar, representasi dengan Adjacency Matrix & Adjacency List, traversal DFS & BFS, hingga penerapannya pada sistem pertemanan media sosial menggunakan C++.
GitHub RepositoryApa Itu Graf?
Graf (Graph) adalah struktur data non-linear yang digunakan untuk merepresentasikan hubungan antar objek. Berbeda dengan struktur data linear seperti array atau linked list, graf mampu menggambarkan relasi yang lebih kompleks karena terdiri dari kumpulan simpul (vertex) dan garis penghubung antar simpul (edge).
Komponen Utama dalam Graf
A ----- B | | | | C ----- D
Jenis-Jenis Graf
Operasi yang Diimplementasikan
Program 1 — Adjacency Matrix
Adjacency Matrix menyimpan graf dalam bentuk matriks 2D berukuran V×V. Nilai 1 berarti ada edge antar dua vertex, dan 0 berarti tidak ada. Mudah dipahami, tapi boros memori karena kompleksitasnya O(V²).
#include <iostream> using namespace std; class Graph { private: int matrix[100][100]; int vertices; public: Graph(int v) { vertices = v; for (int i = 0; i < v; i++) for (int j = 0; j < v; j++) matrix[i][j] = 0; } void addEdge(int u, int v) { matrix[u][v] = 1; matrix[v][u] = 1; // undirected (dua arah) } void display() { cout << "Adjacency Matrix" << endl; for (int i = 0; i < vertices; i++) { for (int j = 0; j < vertices; j++) cout << matrix[i][j] << " "; cout << endl; } } }; int main() { Graph g(4); g.addEdge(0, 1); g.addEdge(0, 2); g.addEdge(1, 3); g.addEdge(2, 3); g.display(); return 0; }
Output Program
Adjacency Matrix 0 1 1 0 1 0 0 1 1 0 0 1 0 1 1 0
- matrix[100][100]Array 2D untuk menyimpan hubungan antar vertex.
- Graph(int v)Constructor yang mengisi seluruh sel matriks dengan 0 (belum ada edge).
- addEdge()Mengisi matrix[u][v] dan matrix[v][u] dengan 1 karena graf dua arah.
- display()Menampilkan isi matriks baris per baris ke layar.
Program 2 — Adjacency List
Adjacency List menyimpan graf sebagai daftar tetangga tiap vertex menggunakan vector. Lebih hemat memori dibanding matrix, terutama untuk graf yang edge-nya sedikit (sparse).
#include <iostream> #include <vector> using namespace std; class Graph { private: int V; vector<vector<int>> adj; public: Graph(int vertices) { V = vertices; adj.resize(V); } void addEdge(int u, int v) { adj[u].push_back(v); adj[v].push_back(u); } void display() { for (int i = 0; i < V; i++) { cout << i << " -> "; for (int node : adj[i]) cout << node << " "; cout << endl; } } }; int main() { Graph g(4); g.addEdge(0, 1); g.addEdge(0, 2); g.addEdge(1, 3); g.addEdge(2, 3); g.display(); return 0; }
Output Program
0 -> 1 2 1 -> 0 3 2 -> 0 3 3 -> 1 2
- vector<vector<int>>Setiap index mewakili satu vertex, isinya daftar vertex tetangganya.
- addEdge()Menambahkan v ke daftar tetangga u, dan sebaliknya (dua arah).
- display()Menampilkan tiap vertex diikuti daftar tetangga langsungnya.
Program 3 — DFS (Depth First Search)
DFS menelusuri graf sedalam mungkin di satu cabang sebelum berpindah ke cabang lain. Diimplementasikan secara rekursif dengan bantuan array visited agar tidak terjadi perulangan tak terbatas.
0
/ \
1 2
| |
3 4
#include <iostream> #include <vector> using namespace std; class Graph { private: int V; vector<vector<int>> adj; vector<bool> visited; public: Graph(int vertices) { V = vertices; adj.resize(V); visited.resize(V, false); } void addEdge(int u, int v) { adj[u].push_back(v); adj[v].push_back(u); } void DFS(int v) { visited[v] = true; cout << v << " "; for (int u : adj[v]) if (!visited[u]) DFS(u); } }; int main() { Graph g(5); g.addEdge(0, 1); g.addEdge(0, 2); g.addEdge(1, 3); g.addEdge(2, 4); cout << "DFS : "; g.DFS(0); return 0; }
Output Program
DFS : 0 1 3 2 4
- visitedArray boolean untuk menandai vertex yang sudah dikunjungi.
- DFS()Menandai vertex, mencetaknya, lalu menelusuri tetangga yang belum dikunjungi secara rekursif (mendalam dulu).
Program 4 — BFS (Breadth First Search)
BFS menelusuri graf per level — dari vertex terdekat ke yang terjauh. Menggunakan struktur queue (FIFO) untuk mengatur urutan kunjungan.
#include <iostream> #include <vector> #include <queue> using namespace std; class Graph { private: int V; vector<vector<int>> adj; public: Graph(int vertices) { V = vertices; adj.resize(V); } void addEdge(int u, int v) { adj[u].push_back(v); adj[v].push_back(u); } void BFS(int start) { vector<bool> visited(V, false); queue<int> q; visited[start] = true; q.push(start); while (!q.empty()) { int v = q.front(); q.pop(); cout << v << " "; for (int u : adj[v]) if (!visited[u]) { visited[u] = true; q.push(u); } } } }; int main() { Graph g(5); g.addEdge(0, 1); g.addEdge(0, 2); g.addEdge(1, 3); g.addEdge(2, 4); cout << "BFS : "; g.BFS(0); return 0; }
Output Program
BFS : 0 1 2 4 3
- queueMenyimpan vertex yang akan dikunjungi dengan urutan FIFO (yang masuk dulu, keluar dulu).
- BFS()Mengambil vertex terdepan, mencetaknya, lalu memasukkan seluruh tetangganya yang belum dikunjungi ke queue. Hasilnya penelusuran per level.
DFS menelusuri sedalam mungkin di satu cabang dulu (cocok untuk cek keterhubungan / pencarian jalur), sedangkan BFS menelusuri per level (cocok untuk mencari jarak/jalur terpendek pada graf tak berbobot).
Studi Kasus — Sistem Pertemanan Media Sosial
Graf sangat cocok untuk memodelkan jaringan pertemanan. Setiap pengguna menjadi vertex, dan hubungan pertemanan menjadi edge. DFS dipakai untuk menemukan seluruh pengguna yang terhubung, sedangkan BFS untuk menentukan tingkat kedekatan pertemanan.
Andi
/ \
Budi Citra
| |
Dina Eko
#include <iostream> #include <vector> #include <queue> using namespace std; class SocialGraph { private: int V; vector<vector<int>> adj; vector<bool> visited; vector<string> users; public: SocialGraph(int v, vector<string> names) { V = v; adj.resize(V); visited.resize(V, false); users = names; } void addEdge(int u, int v) { adj[u].push_back(v); adj[v].push_back(u); } void showFriends(int v) { cout << "Teman " << users[v] << " : "; for (int u : adj[v]) cout << users[u] << " "; cout << endl; } void DFS(int v) { visited[v] = true; cout << users[v] << " "; for (int u : adj[v]) if (!visited[u]) DFS(u); } void BFS(int start) { vector<bool> vis(V, false); vector<int> level(V, -1); queue<int> q; vis[start] = true; level[start] = 0; q.push(start); while (!q.empty()) { int v = q.front(); q.pop(); cout << users[v] << " (tingkat " << level[v] << ")" << endl; for (int u : adj[v]) if (!vis[u]) { vis[u] = true; level[u] = level[v] + 1; q.push(u); } } } }; int main() { vector<string> users = {"Andi", "Budi", "Citra", "Dina", "Eko"}; SocialGraph g(5, users); g.addEdge(0, 1); g.addEdge(0, 2); g.addEdge(1, 3); g.addEdge(2, 4); cout << "===== DATA PERTEMANAN =====" << endl; for (int i = 0; i < 5; i++) g.showFriends(i); cout << "\nDFS (semua yang terhubung dari Andi): "; g.DFS(0); cout << "\n\nBFS (tingkat pertemanan dari Andi):" << endl; g.BFS(0); return 0; }
Output Program
===== DATA PERTEMANAN ===== Teman Andi : Budi Citra Teman Budi : Andi Dina Teman Citra : Andi Eko Teman Dina : Budi Teman Eko : Citra DFS (semua yang terhubung dari Andi): Andi Budi Dina Citra Eko BFS (tingkat pertemanan dari Andi): Andi (tingkat 0) Budi (tingkat 1) Citra (tingkat 1) Dina (tingkat 2) Eko (tingkat 2)
- usersVector string yang menyimpan nama tiap vertex, agar output menampilkan nama, bukan angka.
- showFriends()Menampilkan daftar teman langsung dari satu pengguna.
- DFS()Menelusuri seluruh pengguna yang terhubung — membuktikan jaringan ini saling terhubung.
- BFS()Menghitung tingkat kedekatan: tingkat 0 diri sendiri, tingkat 1 teman langsung, tingkat 2 teman dari teman.
Kelebihan & Kekurangan Graf
- Mampu merepresentasikan hubungan kompleks antar objek
- Banyak dipakai di sistem nyata (media sosial, Google Maps, jaringan)
- Mendukung banyak algoritma pencarian & optimasi (DFS, BFS, Dijkstra)
- Fleksibel: bisa berarah, tak berarah, atau berbobot
- Implementasi lebih kompleks dari struktur data linear
- Adjacency matrix boros memori, O(V²)
- Pengolahan makin berat saat vertex & edge bertambah banyak
Kesimpulan
Graf adalah struktur data non-linear yang memodelkan hubungan antar objek lewat vertex dan edge. Lewat program di atas, kita memahami dua cara representasi (Adjacency Matrix & List) dan dua metode traversal (DFS & BFS), serta penerapannya pada studi kasus sistem pertemanan media sosial.
Pemahaman graf menjadi fondasi untuk mempelajari algoritma lanjutan:
Comments
Post a Comment