Pertemuan 14 - Graf
Graf di C++
1. Implementasi Adjacency Matrix
Deskripsi (Fungsi) Program:
Program ini merepresentasikan graf tak berarah menggunakan matriks dua dimensi berukuran tetap, di mana nilai 1 pada indeks baris dan kolom menunjukkan adanya koneksi antar vertex, sedangkan nilai 0 menunjukkan tidak ada koneksi.
Code:
// Implementasi Adjacency Matrix
#include <bits/stdc++.h>using namespace std;
class Graph { private: int mat[100][100]; int ver;
public: Graph(int v) { ver = v; int i, j; for(i = 0; i < v; i++) { for(j = 0; j < v; j++) { mat[i][j] = 0; } } }
void addEdge(int u, int v) { mat[u][v] = 1; mat[v][u] = 1; }
void display(void) { cout << "Adjancency Matrix" << endl;
ver = v;
int i, j; for(i = 0; i < v; i++) { for(j = 0; j < v; j++) { cout << mat[i][j] << " "; } cout << endl; } }};
int main(void) { Graph g(4);
g.addEdge(0,1); g.addEdge(0,2); g.addEdge(1,3); g.addEdge(2,3);
g.display();
return 0;}
Hasil/Output Program:
Penjelasan Program:
2. Implementasi Adjacency List
Deskripsi (Fungsi) Program:
Program ini menyimpan graf menggunakan daftar ketetanggaan berupa vector of vectors, yang lebih efisien dalam penggunaan memori dibandingkan matriks karena hanya menyimpan data vertex yang benar-benar terhubung.
Code:
// Implementasi Adjacency List
#include <bits/stdc++.h>using namespace std;
class gh { private: int v; vector<vector<int>> adj;
public: gh(int ver) { v = ver; adj.resize(v); }
void addEdge(int u, int v) { adj[u].push_back(v); adj[v].push_back(u); }
void display(void) { int i; for(i = 0; i < v; i++) { cout << i << " -> ";
for(int n : adj[i]) { cout << n << " "; }
cout << endl; } }};
int main(void) { gh g(4);
g.addEdge(0,1); g.addEdge(0,2); g.addEdge(1,3); g.addEdge(2,3);
g.display();
return 0;}
Hasil/Output Program:
Penjelasan Program:
3. Implementasi DFS
Deskripsi (Fungsi) Program:
Program ini menerapkan algoritma penelusuran graf Depth First Search yang mengeksplorasi sedalam mungkin pada satu cabang sebelum melakukan backtracking menggunakan teknik rekursi.
Code:
// Implementasi DFS
#include <bits/stdc++.h>using namespace std;
class gh { private: int v; vector<vector<int>> adj; vector<bool> vis; public: gh(int ver) { v = ver; adj.resize(v); vis.resize(v, false); }
void add(int u, int v) { adj[u].push_back(v); adj[v].push_back(u); }
void dfs(int v) { vis[v] = true; cout << v << " ";
for(int u : adj[v]) { if(!vis[u]) { dfs(u); } } }};
int main(void) { gh g(5);
g.add(0,1); g.add(0,2); g.add(1,3); g.add(2,4);
cout << "DFS: "; g.dfs(0);
return 0;}
Hasil/Output Program:
Penjelasan Program:
4. Implementasi BFS
Deskripsi (Fungsi) Program:
Program ini menerapkan algoritma Breadth First Search yang menelusuri graf lapis demi lapis berdasarkan jarak terdekat dari vertex awal menggunakan struktur data antrean (queue).
Code:
// Implementasi BFS
#include <bits/stdc++.h>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(void) { 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;}
Hasil/Output Program:
Penjelasan Program:
5. Implementasi Graf Berbobot
Deskripsi (Fungsi) Program:
Program ini memodifikasi struktur penyimpanan graf untuk menyertakan bobot pada setiap sisi menggunakan pair, yang memungkinkan representasi biaya atau jarak antar vertex secara spesifik.
Code:
// Implementasi Graf Berbobot
#include <bits/stdc++.h>using namespace std;
class gh { private: map<char, vector<pair<char, int>>> adj;
public: gh(int ver) {}
void add(char u, char v, int w) { adj[u].push_back({v, w}); adj[v].push_back({u, w}); }
void display() { for(auto const& [vertex, edges] : adj) { cout << "Vertex " << vertex << ": "; for(auto const& edge : edges) { cout << "(" << edge.first << "," << edge.second << ") "; } cout << endl; } }};
int main(void) { gh g(4);
g.add('A', 'B', 5); g.add('B', 'D', 3); g.add('D', 'C', 1); g.add('C', 'A', 2);
g.display();
return 0;}
Hasil/Output Program:
Penjelasan Program:
6. Implementasi Dijkstra
Deskripsi (Fungsi) Program:
Program ini mencari jalur terpendek dari satu titik awal ke semua titik lain dalam graf berbobot dengan menggunakan priority queue untuk selalu memilih vertex dengan jarak akumulatif terkecil.
Code:
// Implementasi Dijkstra
#include <bits/stdc++.h>using namespace std;
const int INF = 1000000;vector<pair<int, int>> graph[100];
void dijkstra(int start, int V, const vector<string>& names) { vector<int> dist(V, INF); priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;
dist[start] = 0; pq.push({0, start});
while (!pq.empty()) { int d = pq.top().first; int u = pq.top().second; pq.pop();
if (d > dist[u]) continue;
for (auto edge : graph[u]) { int v = edge.first; int w = edge.second; if (dist[v] > dist[u] + w) { dist[v] = dist[u] + w; pq.push({dist[v], v}); } } }
cout << "Jarak Terpendek dari " << names[start] << ":" << endl; for (int i = 0; i < V; i++) { cout << names[i] << " : " << dist[i] << endl; }}
int main(void) { int V = 3; vector<string> names = {"Surabaya", "Sidoarjo", "Gresik"};
graph[0].push_back({1, 5}); graph[1].push_back({0, 5}); graph[0].push_back({2, 3}); graph[2].push_back({0, 3});
dijkstra(0, V, names);
return 0;}
Hasil/Output Program:
Penjelasan Program:
7. Studi Kasus Praktikum: Sistem Pertemanan di Media Sosial
Deskripsi (Fungsi) Program:
Program ini mensimulasikan jaringan pertemanan sederhana di media sosial dengan memetakan nama pengguna ke dalam struktur graf dan menampilkan daftar teman untuk setiap individu.
Code:
// Studi Kasus Praktikum: Sistem Pertemanan di Media Sosial
#include <bits/stdc++.h>using namespace std;
class Graph {private: int v; vector<vector<int>> adj; vector<string> users;
public: Graph(int ver, vector<string> userNames) { v = ver; users = userNames; adj.resize(v); }
void addEdge(int u, int v_idx) { adj[u].push_back(v_idx); adj[v_idx].push_back(u); }
void display() { for (int i = 0; i < v; i++) { cout << users[i] << " berteman dengan: "; for (int neighbor : adj[i]) { cout << users[neighbor] << " "; } cout << endl; } }};
int main(void) { vector<string> names = {"Andi", "Budi", "Citra", "Dina", "Eko"}; Graph g(5, names);
g.addEdge(0, 1); g.addEdge(0, 2); g.addEdge(1, 3); g.addEdge(2, 4);
g.display();
return 0;}
Hasil/Output Program:
Penjelasan Program:
LATIHAN
A. Graf 8 Vertex dengan Adjacency List
Deskripsi (Fungsi) Program:
Program ini membuat graf dengan 8 vertex yang saling terhubung membentuk siklus menggunakan adjacency list, sebagai bentuk latihan dasar alokasi memori dinamis pada graf.
Code:
// Graf 8 Vertex dengan Adjacency List
#include <iostream>#include <vector>
using namespace std;
class Graph { int V; vector<vector<int>> adj;public: Graph(int V) : V(V), adj(V) {} void addEdge(int u, int v) { adj[u].push_back(v); adj[v].push_back(u); } void printGraph() { for(int i = 0; i < V; ++i) { cout << "Vertex " << i << ": "; for(int v : adj[i]) cout << v << " "; cout << endl; } }};
int main(void) { Graph g(8); g.addEdge(0, 1); g.addEdge(1, 2); g.addEdge(2, 3); g.addEdge(3, 4); g.addEdge(4, 5); g.addEdge(5, 6); g.addEdge(6, 7); g.addEdge(7, 0); g.printGraph(); return 0;}
Hasil/Output Program:
Penjelasan Program:
B. Implementasi DFS dan BFS
Deskripsi (Fungsi) Program:
Program ini menggabungkan dua algoritma penelusuran graf dalam satu kelas untuk mendemonstrasikan perbedaan urutan kunjungan antara penelusuran mendalam (DFS) dan melebar (BFS).
Program ini menggabungkan dua algoritma penelusuran graf dalam satu kelas untuk mendemonstrasikan perbedaan urutan kunjungan antara penelusuran mendalam (DFS) dan melebar (BFS).
Code:
// Implementasi DFS dan BFS
#include <iostream>#include <vector>#include <queue>#include <stack>
using namespace std;
class Graph { int V; vector<vector<int>> adj;public: Graph(int V) : V(V), adj(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); cout << "BFS: "; while(!q.empty()) { int u = q.front(); q.pop(); cout << u << " "; for(int v : adj[u]) if(!visited[v]) { visited[v]=true; q.push(v); } } cout << endl; }
void DFS(int start) { vector<bool> visited(V, false); stack<int> s; s.push(start); cout << "DFS: "; while(!s.empty()) { int u = s.top(); s.pop(); if(!visited[u]) { visited[u]=true; cout << u << " "; } for(int v : adj[u]) if(!visited[v]) s.push(v); } cout << endl; }};
int main() { Graph g(8); g.addEdge(0, 1); g.addEdge(0, 2); g.addEdge(1, 3); g.BFS(0); g.DFS(0); return 0;}
Hasil/Output Program:
Penjelasan Program:
C. Modifikasi menjadi Weighted Graph
Deskripsi (Fungsi) Program:
Program ini melakukan modifikasi pada graf agar setiap sisi memiliki nilai bobot numerik, yang merupakan langkah persiapan untuk mengimplementasikan algoritma jalur terpendek.
Program ini melakukan modifikasi pada graf agar setiap sisi memiliki nilai bobot numerik, yang merupakan langkah persiapan untuk mengimplementasikan algoritma jalur terpendek.
Code:
// Modifikasi menjadi Weighted Graph
#include <iostream>#include <vector>
using namespace std;
typedef pair<int, int> pii;
struct WeightedGraph { int V; vector<vector<pii>> adj; WeightedGraph(int V) : V(V), adj(V) {} void addEdge(int u, int v, int w) { adj[u].push_back({v, w}); adj[v].push_back({u, w}); } void print() { for(int i = 0; i < V; ++i) { cout << "Vertex " << i << ": "; for(auto& edge : adj[i]) cout << "(" << edge.first << ",w=" << edge.second << ") "; cout << endl; } }};
int main() { WeightedGraph wg(8); wg.addEdge(0, 1, 5); wg.print(); return 0;}
Hasil/Output Program:
Penjelasan Program:
D. Implementasi Dijkstra
Deskripsi (Fungsi) Program:
Program ini menerapkan algoritma Dijkstra secara mandiri untuk mencari jalur terpendek dari vertex 0 ke vertex lain dalam graf berbobot yang telah ditentukan.
Program ini menerapkan algoritma Dijkstra secara mandiri untuk mencari jalur terpendek dari vertex 0 ke vertex lain dalam graf berbobot yang telah ditentukan.
Code:
// Implementasi Dijkstra
#include <iostream>#include <vector>#include <queue>#include <climits>
using namespace std;
typedef pair<int, int> pii;
struct WeightedGraph { int V; vector<vector<pii>> adj; WeightedGraph(int V) : V(V), adj(V) {} void addEdge(int u, int v, int w) { adj[u].push_back({v, w}); adj[v].push_back({u, w}); }
void Dijkstra(int start) { vector<int> dist(V, INT_MAX); priority_queue<pii, vector<pii>, greater<pii>> pq; dist[start] = 0; pq.push({0, start}); while(!pq.empty()) { int d = pq.top().first, u = pq.top().second; pq.pop(); if(d > dist[u]) continue; for(auto& edge : adj[u]) { if(dist[u] + edge.second < dist[edge.first]) { dist[edge.first] = dist[u] + edge.second; pq.push({dist[edge.first], edge.first}); } } } for(int i=0; i<V; ++i) cout << "Jarak terpendek ke " << i << ": " << dist[i] << endl; }};
int main() { WeightedGraph wg(8); wg.addEdge(0, 1, 4); wg.addEdge(0, 2, 1); wg.Dijkstra(0); return 0;}
Hasil/Output Program:
Penjelasan Program:
E. Simulasi Jaringan Sosial
Deskripsi (Fungsi) Program:
Program ini mensimulasikan hubungan sosial antar individu menggunakan map dan vector untuk mempermudah identifikasi pertemanan berbasis nama string dibandingkan indeks angka.
Program ini mensimulasikan hubungan sosial antar individu menggunakan map dan vector untuk mempermudah identifikasi pertemanan berbasis nama string dibandingkan indeks angka.
Komentar
Posting Komentar