consolidate all repos to one for archive
This commit is contained in:
3
semester_2/osnove_algoritmov/naloga_3/.gitignore
vendored
Normal file
3
semester_2/osnove_algoritmov/naloga_3/.gitignore
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
.idea/*
|
||||
cmake-build-debug/*
|
||||
CMakeLists.txt
|
41
semester_2/osnove_algoritmov/naloga_3/QuickSort.cpp
Normal file
41
semester_2/osnove_algoritmov/naloga_3/QuickSort.cpp
Normal file
@@ -0,0 +1,41 @@
|
||||
//
|
||||
// Created by Nik on 16/04/2022.
|
||||
//
|
||||
|
||||
#include "QuickSort.h"
|
||||
|
||||
|
||||
void QuickSort::swap(Povezava *a, Povezava *b) {
|
||||
Povezava t = *a;
|
||||
*a = *b;
|
||||
*b = t;
|
||||
}
|
||||
|
||||
int QuickSort::partition(Povezava *A, int low, int high) {
|
||||
int m = (low + high) / 2;
|
||||
swap(&A[low], &A[m]);
|
||||
|
||||
int w = A[low].cost;
|
||||
int i = low;
|
||||
int j = high;
|
||||
|
||||
while (j > i) {
|
||||
while (A[j].cost >= w && j > low) j = j - 1;
|
||||
while (A[i].cost <= w && i < high) i = i + 1;
|
||||
if (i < j) {
|
||||
swap(&A[i], &A[j]);
|
||||
}
|
||||
}
|
||||
swap(&A[low], &A[j]);
|
||||
return j;
|
||||
}
|
||||
|
||||
void QuickSort::quickSort(Povezava *A, int low, int high) {
|
||||
if (low < high) {
|
||||
int j = partition(A, low, high);
|
||||
quickSort(A, low, j - 1);
|
||||
quickSort(A, j + 1, high);
|
||||
}
|
||||
}
|
||||
|
||||
|
24
semester_2/osnove_algoritmov/naloga_3/QuickSort.h
Normal file
24
semester_2/osnove_algoritmov/naloga_3/QuickSort.h
Normal file
@@ -0,0 +1,24 @@
|
||||
//
|
||||
// Created by Nik on 16/04/2022.
|
||||
//
|
||||
|
||||
#ifndef NALOGA_3_QUICKSORT_H
|
||||
#define NALOGA_3_QUICKSORT_H
|
||||
|
||||
struct Povezava{
|
||||
int p, q, cost;
|
||||
};
|
||||
|
||||
class QuickSort {
|
||||
private:
|
||||
QuickSort() = default;
|
||||
public:
|
||||
static void swap(Povezava *a, Povezava *b);
|
||||
|
||||
static int partition(Povezava A[], int low, int high);
|
||||
|
||||
static void quickSort(Povezava A[], int low, int high);
|
||||
};
|
||||
|
||||
|
||||
#endif //NALOGA_3_QUICKSORT_H
|
1
semester_2/osnove_algoritmov/naloga_3/README.md
Normal file
1
semester_2/osnove_algoritmov/naloga_3/README.md
Normal file
@@ -0,0 +1 @@
|
||||
Navodila v folder navodila
|
169
semester_2/osnove_algoritmov/naloga_3/main.cpp
Normal file
169
semester_2/osnove_algoritmov/naloga_3/main.cpp
Normal file
@@ -0,0 +1,169 @@
|
||||
#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;
|
||||
}
|
||||
|
BIN
semester_2/osnove_algoritmov/naloga_3/navodila/Vaja_3.pdf
Normal file
BIN
semester_2/osnove_algoritmov/naloga_3/navodila/Vaja_3.pdf
Normal file
Binary file not shown.
15
semester_2/osnove_algoritmov/naloga_3/navodila/graf.txt
Normal file
15
semester_2/osnove_algoritmov/naloga_3/navodila/graf.txt
Normal file
@@ -0,0 +1,15 @@
|
||||
8
|
||||
13
|
||||
1 2 1
|
||||
2 3 2
|
||||
4 6 2
|
||||
3 5 3
|
||||
7 8 3
|
||||
1 3 4
|
||||
5 6 4
|
||||
2 5 5
|
||||
3 4 7
|
||||
4 5 10
|
||||
6 7 13
|
||||
6 8 15
|
||||
4 7 20
|
21
semester_2/osnove_algoritmov/naloga_3/navodila/graf2.txt
Normal file
21
semester_2/osnove_algoritmov/naloga_3/navodila/graf2.txt
Normal file
@@ -0,0 +1,21 @@
|
||||
10
|
||||
19
|
||||
1 2 33
|
||||
1 3 10
|
||||
1 4 56
|
||||
2 4 13
|
||||
2 5 21
|
||||
3 4 23
|
||||
3 6 24
|
||||
3 7 65
|
||||
4 5 51
|
||||
4 7 20
|
||||
5 7 17
|
||||
5 8 35
|
||||
6 7 40
|
||||
6 9 72
|
||||
7 8 99
|
||||
7 9 45
|
||||
7 10 42
|
||||
8 10 38
|
||||
9 10 83
|
15
semester_2/osnove_algoritmov/naloga_3/navodila/graf_rot.txt
Normal file
15
semester_2/osnove_algoritmov/naloga_3/navodila/graf_rot.txt
Normal file
@@ -0,0 +1,15 @@
|
||||
8
|
||||
13
|
||||
7 4 20
|
||||
8 6 15
|
||||
7 6 13
|
||||
5 4 10
|
||||
4 3 7
|
||||
5 2 5
|
||||
3 1 4
|
||||
6 5 4
|
||||
5 3 3
|
||||
8 7 3
|
||||
3 2 2
|
||||
6 4 2
|
||||
2 1 1
|
@@ -0,0 +1,29 @@
|
||||
#include <fstream>
|
||||
|
||||
using namespace std;
|
||||
|
||||
int main(){
|
||||
....
|
||||
ifstream f("graf.txt"); // odpremo datoteko (v isti mapi, kot je projekt oziroma exe datoteka)
|
||||
// če so težave z branjem, zapišite absolutno pot, npr: ifstream f("c:/graf.txt");
|
||||
|
||||
f >> stevilo_vozlisc; // v prvi vrstici datoteke imamo stevilo vozlisc
|
||||
f >> stevilo_povezav; // v drugi vrstici datoteke imamo stevilo povezav oziroma vrstic v nadaljevnaju datoteke
|
||||
ustvari matriko sosednosti C (2D polje); // priporočamo dinamično alokacijo
|
||||
for(i to stevilo_povezav....){
|
||||
f >> v1 >> v2 >> cena; // v vsaki vrstici beremo 3 podatke (stevilke)
|
||||
v matriki C označi vozlišči v1 in v2 kot soseda in vpiši ceno povezave
|
||||
}
|
||||
|
||||
ustvari polje povezav P; // priporočamo dinamično alokacijo
|
||||
for(p to stevilo_vozlisc....) { // preiščemo zgornji trikotni del matrike C
|
||||
for (q=p+1 to stevilo_vozlisc....) {
|
||||
if (C[p][q] != infinity) {
|
||||
cena = C[p][q];
|
||||
ustvari objekt tipa Povezava in mu določi atribute p, q in cena;
|
||||
shrani objekt v polje P;
|
||||
}
|
||||
}
|
||||
}
|
||||
...
|
||||
}
|
Reference in New Issue
Block a user