#include #include #include #include "QuickSort.h" bool pogoj1(const int *S, const Povezava pov) { if (S[pov.p] == 0 or S[pov.q] == 0) return false; return (S[pov.p] == S[pov.q]); } bool pogoj2(const int *S, const Povezava pov) { if (S[pov.p] == 0 or S[pov.q] == 0) return false; return (S[pov.p] != S[pov.q]); } bool pogoj3(const int *S, const Povezava pov) { if (S[pov.p] != 0 and S[pov.q] == 0) return true; if (S[pov.q] != 0 and S[pov.p] == 0) return true; return false; } bool pogoj4(const int *S, const Povezava pov) { return (S[pov.p] == 0 and S[pov.q] == 0); } void Kruskal(Povezava *P, Povezava *R, int st_vozlisc, int st_povezav) { QuickSort::quickSort(P, 0, st_povezav - 1); int S[st_vozlisc + 1]; for (int i = 0; i < st_vozlisc + 1; i++) S[i] = 0; bool koncano = false; int i = 0; int st_sprej_pov = 0; int stevilo_mnozic = 1; while (!koncano) { if (!pogoj1(S, P[i])) { if (pogoj2(S, P[i])) { R[st_sprej_pov] = P[i]; st_sprej_pov = st_sprej_pov + 1; int pridruzujem = S[P[i].p]; int odstranjujem = S[P[i].q]; for (int l = 0; l < st_vozlisc; l++) { if (S[l] == odstranjujem) S[l] = pridruzujem; } } else if (pogoj3(S, P[i])) { R[st_sprej_pov] = P[i]; st_sprej_pov = st_sprej_pov + 1; if (S[P[i].p] != 0 and S[P[i].q] == 0) S[P[i].q] = S[P[i].p]; if (S[P[i].q] != 0 and S[P[i].p] == 0) S[P[i].p] = S[P[i].q]; } else if (pogoj4(S, P[i])) { R[st_sprej_pov] = P[i]; st_sprej_pov = st_sprej_pov + 1; S[P[i].p] = stevilo_mnozic; S[P[i].q] = stevilo_mnozic; stevilo_mnozic += 1; } } if (st_sprej_pov == st_vozlisc - 1) { koncano = true; } else { i = i + 1; } } } void nafilajRand(Povezava *&P, Povezava *&R, int st_vozlisc, int &st_povezav){ st_povezav = (st_vozlisc * (st_vozlisc - 1)) / 2; P = new Povezava[st_povezav]; R = new Povezava[st_vozlisc - 1]; int k = 0; for(int i = 1; i <= st_vozlisc; i++){ for(int j = 1 + i; j <= st_vozlisc; j++){ if(i != j) { P[k].p = i; P[k].q = j; P[k].cost = rand(); k++; } } } std::cout << "Vozlisca: " << st_vozlisc << " Povezave: " << st_povezav << "\n"; } void beri(Povezava *&P, Povezava *&R, int &st_vozlisc, int &st_povezav){ std::ifstream f("graf2.txt"); f >> st_vozlisc; f >> st_povezav; P = new Povezava[st_povezav]; R = new Povezava[st_vozlisc - 1]; for (int i = 0; i < st_povezav; ++i) { int v1, v2, cena; f >> v1 >> v2 >> cena; P[i].p = v1; P[i].q = v2; P[i].cost = cena; } f.close(); std::cout << "Vozlisca: " << st_vozlisc << " Povezave: " << st_povezav << "\n"; } void menu() { std::cout << "Kruskalov algoritem - izbira: \n" "1 Preberi graf iz datoteke \n" "2 Generiraj nakljucni graf \n" "3 Pozeni \n" "4 Izpis sprejetih povezav \n" "0 Konec \n\n" "Vasa izbira: "; } int main() { std::cout << "Hello, World!" << std::endl; int st_povezav, st_vozlisc; clock_t start,finish; double duration; Povezava *R; Povezava *P; bool running = true; while (running) { menu(); int coich; std::cin >> coich; switch (coich) { case 1: beri(P,R,st_vozlisc,st_povezav); break; case 2: do{ std::cout << "stevilo vozlisc: "; std::cin >> st_vozlisc; }while(st_vozlisc > 1500); nafilajRand(P, R, st_vozlisc, st_povezav); break; case 3: start = clock(); Kruskal(P, R, st_vozlisc, st_povezav); finish = clock(); duration = (double) (finish - start) / CLOCKS_PER_SEC; std::cout << "Time to sort " << duration << "\n"; break; case 4: for (int i = 0; i < st_vozlisc - 1; i++) { std::cout << R[i].p << " " << R[i].q << " " << R[i].cost << "\n"; } break; case 0: running = false; break; default: std::cout << " Napaka\n"; break; } } return 0; }