Graflarda eng kichik uzunlikdagi daraxtlarni qurish algoritmlari
-rasm. Kruskal algoritmining bajarilish ketma-ketligi
Download 497.39 Kb.
|
6-Amaliy top
- Bu sahifa navigatsiya:
- 15.2. Prima algoritmi
- Prima algoritmining C++ kodi
60-rasm. Kruskal algoritmining bajarilish ketma-ketligi
Kruskal algoritmini realizatsiya qilish (C++ kodi) int n, m; cin >> n >> m; vector for (int i = 0; i < m; ++i) cin >> edges[i][1] >> edges[i][2] >> edges[i][0]; sort(edges.begin(), edges.end()); vector for (int i = 0; i < n; ++i) comp[i] = i; int ans = 0; for (auto & edge: edges) { int weight = edge[0]; int start = edge[1]; int end = edge[2]; if (comp[start] != comp[end]) { ans += weight; int a = comp[start]; int b = comp[end]; for (int i = 0; i < n; ++i) if (comp[i] == b) comp[i] = a; } } 15.2. Prima algoritmi Prima algoritmi quyidagi tartibda ishlaydi 1-bosqich. Uchni tanlash 2-bosqich. Ushbu uchdan eng qisqa qirrani tanlash va uni qo'shish 4-bosqich. Grafda hali topilmagan eng yaqin uchni tanlang, agar bir nechta variant, tasodifiy birini tanlash 3-bosqich. Grafdan hali tanlanmagan eng yaqin uchni tanlash Keyingi bosqichlar. Yuqoridagi ishlarni daraxt hosil bo’lguncha takrorlash Prima algoritmining C++ kodi Quyidagi dastur Primaning algoritmini C ++ da amalga oshiradi. Grafni ko'rsatish uchun qo'shnilik matritsa ishlatilgan bo'lsa-da, ushbu algoritm samaradorligini oshirish uchun qo'shnilik ro'yxati yordamida ham amalga oshirilishi mumkin. #include #include using namespace std; #define INF 9999999 #define V 5 //Qo'shnilik matritsasini ifodalash uchun //5x5 o'lchamdagi ikki o'lchamli massivni yaratish int G[V][V] = { {0, 9, 75, 0, 0}, {9, 0, 95, 19, 42}, {75, 95, 0, 51, 66}, {0, 19, 51, 0, 31}, {0, 42, 66, 31, 0} }; int main () { int no_edge; // qirralar soni // tanlangan uchni kuzatish uchun massiv yaratish int selected[V]; // dastlab false qiymatini berish memset (selected, false, sizeof (selected)); // qiralar soniga 0 ni berish no_edge = 0; selected[0] = true; int x; // qator raqami int y; // ustun raqami // qirra va og'irlikni chop etish cout << "Qirra" << " : " << "Masofasi"; cout << endl; while (no_edge < V - 1) { int min = INF; x = 0; y = 0; for (int i = 0; i < V; i++) { if (selected[i]) { for (int j = 0; j < V; j++) { if (!selected[j] && G[i][j]) { if (min > G[i][j]) { min = G[i][j]; x = i; y = j; } }
} cout << x << " - " << y << " : " << G[x][y]; cout << endl; selected[y] = true; no_edge++; } return 0; } Download 497.39 Kb. Do'stlaringiz bilan baham: |
Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling
ma'muriyatiga murojaat qiling