#include #include using namespace std; struct node{ int ime; int predhodnik; int dolzina; int status; }; node graf[1000]; int S[1000]; int rel[1000][1000]; // -1 e prazen sklad int stackPtr = -1; int nodeCount = 0; int relCount = 0; // stavame vrednost na skladot ako ne e poln void push(int s) { if(stackPtr > 999) return; S[++stackPtr] = s; } // vadime vrednost od skladot ako ne e prazen int pop() { if(stackPtr == -1) return -1234; return S[ stackPtr-- ]; } void beri(string f) { fstream dat(f.c_str(), fstream::in); dat >> nodeCount; int p, q, dol, cnt = 0; bool a, b; for(int i = 0; i < nodeCount; i++) graf[i].ime = i; while(!dat.eof()) { a = true; b = true; // vcitvame vrednostite dat >> p >> q >> dol; // postavuvame relacijata // a->b b->a (refleksivna) rel[p - 1][q - 1] = 1; rel[q - 1][p - 1] = 1; cnt++; } dat.close(); relCount = cnt; } void iskanje_v_globuno(int start, int cilj) { for(int i = 0; i < nodeCount; i++) { graf[i].status = 0; graf[i].dolzina = 1000; graf[i].predhodnik = -1; } graf[ start ].status = 1; graf[ start ].dolzina = 0; graf[ start ].predhodnik = -1; push(start); int tmp; while(stackPtr != -1) { // zemame element od skladot tmp = pop(); // ako e toj element elementot koj go baravme // prekinuvame so baranjeto if(graf[tmp].ime == graf[cilj].ime) return; // odime preku site elementi... for(int i = 0; i < nodeCount; i++) { // ... i proveruvame koj e sosed so elementot koj go dobivme od skladot if(rel[ graf[tmp].ime ][i] == 1) { // sekoj od sosedite gi stavame na skladot int sosed = i; if(graf[sosed].status == 0) { graf[sosed].status = 1; // nivnata dolzina na nastavuvame kako dolzinata na predhodnikot + 1 graf[sosed].dolzina = graf[tmp].dolzina + 1; graf[sosed].predhodnik = tmp; // on the stack she goes push(sosed); } // belezime elementot kako pregledan graf[tmp].status = 2; } } } } void izpisi_poti(int s, int v, int c) { if(s == v) { cout << "Dolzina poti do " << s + 1 << " je " << c << endl; cout << "Pot: " << graf[v].ime + 1 << " "; } else { if(graf[v].predhodnik == -1) { cout << "Pot ne obstaja!"; return; } else { izpisi_poti(s, graf[v].predhodnik, c); cout << graf[v].ime + 1 << " "; } } } int main() { int start, end, c = -1; while(c != 0) { cout << "===========================" << endl; cout << "1. Preberi graf iz datoteke" << endl; cout << "2. Pozeni iskanje iz vozlisca s do d" << endl; cout << "0. Konec" << endl; cout << "===========================" << endl; cout << "Izbir >>> "; cin >> c; switch(c) { case 1: beri("graf.txt"); break; case 2: if(nodeCount == 0) { cout << "Se niste prebrali iz datoteke!" << endl; break; } do { cout << "Vpisite vrednost za vozlisce s >>> "; cin >> start; }while(start > nodeCount || start <= 0); do { cout << "Vpisite vrednost za vozlisce d >>> "; cin >> end; }while(end > nodeCount || end <= 0); iskanje_v_globuno(start - 1, end - 1); izpisi_poti(start - 1, end - 1, graf[end].dolzina); cout << endl; break; case 0: break; } } return 0; }