#include #include #include const int inf = 9999; struct struktura { std::vector vozlisca; int dolzina; bool isInPot(const int p){ for (int i = 0; i < vozlisca.size(); ++i) { if(vozlisca[i] == p) return true; } return false; } }; struktura vzemiIzVrste(std::vector &Q) { struktura tmp; int index = 0; for (int i = 0; i < Q.size(); ++i) { if(Q[index].dolzina > Q[i].dolzina){ index = i; } } auto it = Q.begin(); it += index; tmp = Q[index]; Q.erase(it); return tmp; } void razvejiInOmeji(int **&G, const int s, const int g, std::vector>& R, const int stVozlisc , int& dolzina) { std::vector Q; struktura pot; pot.vozlisca.push_back(s); pot.dolzina = 0; dolzina = inf; Q.push_back(pot); struktura p; struktura p1; int u; while (!Q.empty()) { p = vzemiIzVrste(Q); u = p.vozlisca.back(); for (int v = 0; v < stVozlisc; ++v) { if (G[u][v] != inf) { if(!p.isInPot(v)){ p1 = p; p1.vozlisca.push_back(v); p1.dolzina += G[u][v]; if(v == g){ if(p1.dolzina < dolzina){ R.clear(); R.push_back(p1.vozlisca); dolzina = p1.dolzina; }else if(p1.dolzina == dolzina){ R.push_back(p1.vozlisca); } }else if(p.dolzina < dolzina){ Q.push_back(p1); } } } } } } void izpis(const std::vector>& R, int dolzina){ for (int i = 0; i < R.size(); ++i) { for (int j = 0; j < R[i].size(); ++j) { std::cout << R[i][j] << "->"; } } std::cout << ", cena = " << dolzina << "\n"; } void beri(int**& C, int& stVozlisc) { int stPovezav; std::ifstream f("graf2.txt"); f >> stVozlisc; f >> stPovezav; int v1, v2, cena; C = new int *[stVozlisc]; for (int i = 0; i < stVozlisc; i++) { C[i] = new int[stVozlisc]; } for (int i = 0; i < stVozlisc; ++i) { for (int j = 0; j < stVozlisc; ++j) { C[i][j] = inf; } } for (int i = 0; i < stPovezav; i++) { f >> v1 >> v2 >> cena; C[v1 - 1][v2 - 1] = cena; } std::cout << "Vozlisca: " << stVozlisc << " Povezave: " << stPovezav << "\n"; // for (int i = 0; i < stVozlisc; ++i) // { // for (int j = 0; j < stVozlisc; ++j) // { // std::cout << C[i][j] << " "; // } // std::cout << "\n"; // } } void menu(){ std::cout << "Razveji in omeji - izbira:\n" "1 Preberi podatke iz datoteke\n" "2 Iskanje poti med vozliscema s in g\n" "3 Konec\n" "Vasa izbira:"; } int main() { int **C; int stVozlisc; std::vector> R; int dolzina; int izbira, start, end; bool running = true; while (running){ menu(); std::cin >> izbira; switch (izbira) { case 1: beri(C, stVozlisc); break; case 2: std::cout << "Izberi s: "; std::cin >> start; std::cout << "Izberi end: "; std::cin >> end; razvejiInOmeji(C,start,end,R,stVozlisc, dolzina); izpis(R, dolzina); break; default: running = false; break; } } return 0; }