170 lines
4.7 KiB
C++
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;
|
|
}
|
|
|