-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathpraktikum6Postest.cpp
228 lines (215 loc) · 7.25 KB
/
praktikum6Postest.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
// Praktikum 6: BFS dan DFS
// Penerapan contoh di slide kuliah Strategi Algoritma - BFS dan DFS hal 14
// header
#include <windows.h>
#include <iostream>
#include <list>
// header untuk menggambar graf dengan OpenG
#include "draws.h"
using namespace std;
// deklarasi global Graph
Graph graph;
// buffer untuk simpan teks
char markText[10];
// hasil dari penerapan algoritma
vector<int> *pathResult;
vector<int> pathSequence;
// fungsi rekursi untuk Depth First Search (DFS)
void DFSRecursive(Graph graph, int startIdx, int endIdx, bool visited[])
{
// tandai node sekarang sebagai node yang dikunjungi
visited[startIdx] = true;
cout << startIdx << " ";
pathSequence.push_back(startIdx);
// rekursi ke semua node yang bertetangga
for (int i = 0; i < graph.getAdjNodes()[startIdx].size(); i++)
{
int nodeIdx = graph.getAdjNodes()[startIdx].at(i);
if (!visited[nodeIdx])
{
DFSRecursive(graph, nodeIdx, startIdx, visited);
pathResult[startIdx].push_back(nodeIdx);
}
}
// jika semua node cabang pada node awal sudah habis maka
// tentukan node baru yang belum dikunjungi sebagai node awal
if (startIdx == endIdx)
{
int j = 0;
// cari node yang belum dikunjungi
while (visited[j] && j < graph.getNumNodes())
j++;
// bila ada node yang belum dikunjungi maka masukan dalam antrian
if (!visited[j] && j < graph.getNumNodes())
DFSRecursive(graph, j, j, visited);
}
}
// fungsi untuk menerapkan Depth First Search (DFS) pada graf
// graph = graf
// startIdx = indeks node mulai
void DFS(Graph graph, int startIdx)
{
// tandai semua node yang belum dikunjungi
bool *visited = new bool[graph.getNumNodes()];
for (int i = 0; i < graph.getNumNodes(); i++)
visited[i] = false;
pathSequence.clear();
pathResult = new vector<int>[graph.getNumNodes()];
// rekursi DFS
DFSRecursive(graph, startIdx, startIdx, visited);
}
// fungsi untuk menerapkan Breadth First Search (BFS) pada graf
// graph = graf
// startIdx = indeks node mulai
void BFS(Graph graph, int startIdx)
{
// tandai semua node yang belum dikunjungi
bool *visited = new bool[graph.getNumNodes()];
for (int i = 0; i < graph.getNumNodes(); i++)
visited[i] = false;
// buat antrian node
list<int> queue;
// tandai node sekarang sebagai node yang dikunjungi
visited[startIdx] = true;
queue.push_back(startIdx);
pathSequence.clear();
pathResult = new vector<int>[graph.getNumNodes()];
while (!queue.empty())
{
// keluarkan node dari antrian dan cetak indeksnya
startIdx = queue.front();
cout << startIdx << " ";
pathSequence.push_back(startIdx);
queue.pop_front();
// ambil semua node yang bertetangga dengan node sekarang
// dari daftar antrian node
for (int i = 0; i < graph.getAdjNodes()[startIdx].size(); i++)
{
// jika node tetangganya belum dikunjungi maka tandai
// telah dikunjungi dan keluarkan dari antrian
int nodeIdx = graph.getAdjNodes()[startIdx].at(i);
if (!visited[nodeIdx])
{
visited[nodeIdx] = true;
queue.push_back(nodeIdx);
pathResult[startIdx].push_back(nodeIdx);
}
}
// jika antrian kosong tapi masih ada node yang belum dikunjungi
// maka buat node tersebut sebagai titik awal lagi
if (queue.empty())
{
int j = 0;
// cari node yang belum dikunjungi
while (visited[j] && j < graph.getNumNodes())
j++;
// bila ada node yang belum dikunjungi maka masukan di antrian
if (!visited[j] && j < graph.getNumNodes())
{
visited[j] = true;
queue.push_back(j);
}
}
}
}
// fungsi untuk menggambar jalur hasil pencarian dengan OpenGL
void drawResult()
{
glPushMatrix();
// gambar garis dengan anak panah
float radius = 15.0f;
for (int i = 0; i < graph.getNumNodes(); i++)
{
for (int j = 0; j < pathResult[i].size(); j++)
{
int nodeIdx = pathResult[i].at(j);
Vec3 color(1.0f, 0.0f, 1.0f);
drawLine(graph.getNodePosition(), i, nodeIdx, color,
radius, 2.0f, graph.getIsDirected());
}
}
// gambar urutan hasil pencarian
for (int i = 0; i < pathSequence.size(); i++)
{
int nodeIdx = pathSequence.at(i);
if (i == 0)
sprintf(markText, "%s", "start");
else
sprintf(markText, "%d", i);
Vec3 position(
graph.getNodePosition()[nodeIdx].getX() + 2.0f * radius,
graph.getNodePosition()[nodeIdx].getY() + 2.0f * radius,
0.0f);
Vec3 color(1.0f, 0.0f, 1.0f);
drawText(position, color, markText, radius, 2.0f);
}
glPopMatrix();
}
// taruh semua obyek yang akan digambar di fungsi display()
void displayGraph()
{
// bersihkan dan reset layar dan buffer
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
// posisikan kamera pandang
gluLookAt(0.0f, 0.0f, 2.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f);
// panggil fungsi untuk menggambar obyek
drawNodes();
if (!pathSequence.empty())
drawResult();
drawEdges();
// tampilkan obyek ke layar
glutSwapBuffers();
}
// kode tester
int main(int argc, char **argv)
{
// inisialisasi graf
graph.setIsDirected(true);
graph.setNumLevels(4);
graph.setNumNodes(6);
// tambahkan nodes
graph.addNode(0, 1, 1.00f);
graph.addNode(1, 0, 1.1f);
graph.addNode(2, 0, 0.95f);
graph.addNode(3, 2, 1.00f);
graph.addNode(4, 3, 1.1f);
graph.addNode(5, 3, 0.95f);
// tambahkan edges
graph.addEdge(0, 1);
graph.addEdge(0, 2);
graph.addEdge(0, 3);
graph.addEdge(1, 4);
graph.addEdge(2, 1);
graph.addEdge(3, 4);
graph.addEdge(3, 5);
graph.addEdge(4, 5);
graph.addEdge(5, 2);
// perkiraan posisi node
graph.setNodePosition();
// terapkan BFS
int startIdx = 0;
cout << "BFS mulai dari node " << startIdx << "\n";
BFS(graph, startIdx);
// // terapkan DFS
// int startIdx = 0;
// cout << "DFS mulai dari node " << startIdx << "\n";
// DFS(graph, startIdx);
// inisialisasi jendela OpenGL
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);
// set ukuran jendela tampilan dalam piksel
glutInitWindowSize(SCREEN_WIDTH, SCREEN_HEIGHT);
// posisi jendela dilayar komputer dalam piksel
glutInitWindowPosition(100, 100);
// judul jendela (isi dengan NAMA / NIM - JUDUL PRAKTIKUM)
glutCreateWindow("Muhammad Farkhan Maulana / 2000018280 - PRAKTIKUM STRATEGI ALGORITMA");
// panggil fungsi init untuk inisialisasi awal
initView();
// event handler untuk displa
glutDisplayFunc(displayGraph);
glutReshapeFunc(reshapeView);
// looping
glutMainLoop();
return 0;
}