170 lines
4.7 KiB
C++

#include <iostream>
#include <fstream>
#include <cstdlib>
#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;
}