141 lines
3.7 KiB
C++

#include <iostream>
#include <stack>
#include <fstream>
#define NEPREGLEDANO 0
#define V_OBDELAVI 1
#define RAZVITO 2
struct Vozlisce {
int predhodnik;
int dolzina;
int status;
int indeks;
};
void ISKANJE_V_GLOBINO(int s, int size, const int G[], Vozlisce vozl[]) {
std::stack<int> stack;
for (int i = 0; i < size; i++) {
vozl[i].status = NEPREGLEDANO;
vozl[i].dolzina = -1;
vozl[i].predhodnik = -1;
vozl[i].indeks = i;
}
vozl[s].status = V_OBDELAVI;
vozl[s].dolzina = 0;
vozl[s].predhodnik = -1;
stack.push(s); // vstavi na vrh sklada
while (!stack.empty()) {
int v = stack.top();//vzemi vozlišče iz vrha sklada
stack.pop();
for (int i = 0; i < size; ++i) {
if (G[size * v + i] == 1) {
if (vozl[i].status == NEPREGLEDANO) {
vozl[i].status = V_OBDELAVI;
vozl[i].dolzina = vozl[v].dolzina + 1;
vozl[i].predhodnik = vozl[v].indeks;
stack.push(i); // vstavi na vrh sklada
}
}
}
vozl[v].status = RAZVITO;
}
}
void IZPIS_POTI(int iskano, Vozlisce vozl[]) {
if (vozl[iskano].predhodnik == -1) {
std::cout << vozl[iskano].indeks << " ";
return;
} else {
IZPIS_POTI(vozl[iskano].predhodnik, vozl);
std::cout << vozl[iskano].indeks << " ";
}
}
void IZPIS_SEZNAMA(Vozlisce vozl[], int size) {
for (int i = 0; i < size; i++) {
std::cout << "indeks: " << vozl[i].indeks << "\n";
std::cout << "predhodnik: " << vozl[i].predhodnik << "\n";
std::cout << "dolzina: " << vozl[i].dolzina << "\n\n";
}
}
void menu() {
std::cout << "Iskanje v globino:\n"
"1) Preberi graf\n"
"2) Pozeni iskanje iz vozlisca s\n"
"3) Izpis seznama vozlisc in njihovih podatkov\n"
"4) Izpis poti med vozliscema s in d\n"
"0) Konec\n"
"Vasa izbira: ";
}
int main() {
std::cout << "Hello, World!" << std::endl;
Vozlisce *vozl;
int *G;
int stevilo_vozlisc;
int stevilo_povezav;
std::ifstream f("graf_big.txt");
f >> stevilo_vozlisc;
f >> stevilo_povezav;
vozl = new Vozlisce[stevilo_vozlisc];
G = new int[stevilo_vozlisc * stevilo_vozlisc];
for (int i = 0; i < stevilo_povezav; ++i) {
int v1, v2, cena;
f >> v1 >> v2 >> cena;
v1 = v1 - 1;
v2 = v2 - 1;
G[stevilo_vozlisc * v1 + v2] = 1;
G[stevilo_vozlisc * v2 + v1] = 1;
}
bool running = true;
int selection;
int izbira;
do {
menu();
std::cin >> selection;
std::cout << std::endl;
switch (selection) {
case 1:
std::cout << "Prebrano\n"
"St.vozlisc: " << stevilo_vozlisc << " St.povezav: " << stevilo_povezav << "\n";
break;
case 2:
std::cout << "Izberi vozlisce: ";
std::cin >> izbira;
ISKANJE_V_GLOBINO(izbira, stevilo_vozlisc, G, vozl);
break;
case 3:
IZPIS_SEZNAMA(vozl, stevilo_vozlisc);
break;
case 4:
std::cout << "Izberi vozlisce: ";
std::cin >> izbira;
IZPIS_POTI(izbira, vozl);
break;
case 0:
running = false;
break;
default:
std::cout << "Wrong selection!\n";
break;
}
std::cout << std::endl;
} while (running);
delete[] vozl;
delete[] G;
return 0;
}