Advertisement
Guest User

cogobebi

a guest
Jan 18th, 2020
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.08 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3.  
  4. template <typename TipOznake>
  5. class UsmjereniGraf;
  6.  
  7. template <typename TipOznake>
  8. class Cvor;
  9.  
  10. template <typename TipOznake>
  11. class GranaIterator;
  12.  
  13. template <typename TipOznake>
  14. class UsmjereniGraf;
  15.  
  16. template <typename TipOznake>
  17. class Grana {
  18.  
  19. UsmjereniGraf<TipOznake>* graf;
  20. int polazni, dolazni;
  21.  
  22. public:
  23.  
  24. Grana (UsmjereniGraf<TipOznake> *graf, int polazni, int dolazni) :
  25. graf(graf), polazni(polazni), dolazni(dolazni) {}
  26.  
  27. float dajTezinu() const {
  28. return graf->dajTezinuGrane(polazni, dolazni);
  29. }
  30.  
  31. void postaviTezinu (float tezina) {
  32. graf->postaviTezinuGrane(polazni, dolazni, tezina);
  33. }
  34.  
  35. TipOznake dajOznaku() const {
  36. return graf->dajOznakuGrane(polazni, dolazni);
  37. }
  38.  
  39. void postaviOznaku (TipOznake oznaka) {
  40. return graf->postaviOznakuGrane(polazni, dolazni, oznaka);
  41. }
  42.  
  43. Cvor<TipOznake> dajPolazniCvor() const {
  44. return graf->dajCvor(polazni);
  45. }
  46.  
  47. Cvor<TipOznake> dajDolazniCvor() const {
  48. return graf->dajCvor(dolazni);
  49. }
  50.  
  51. };
  52.  
  53. template <typename TipOznake>
  54. class Cvor {
  55.  
  56. UsmjereniGraf<TipOznake>* graf;
  57. int redniBroj;
  58.  
  59. public:
  60. Cvor (UsmjereniGraf<TipOznake>* graf, int redniBroj) : graf(graf), redniBroj(redniBroj) {}
  61.  
  62. TipOznake dajOznaku() const {
  63. return graf->dajOznakuCvora(redniBroj);
  64. }
  65.  
  66. void postaviOznaku(TipOznake oznaka) {
  67. graf->postaviOznakuCvora(redniBroj, oznaka);
  68. }
  69.  
  70. int dajRedniBroj() const {
  71. return redniBroj;
  72. }
  73.  
  74. };
  75.  
  76. template <typename TipOznake>
  77. class UsmjereniGraf {
  78.  
  79. public:
  80. UsmjereniGraf(int brojCvorova) {}
  81. virtual ~UsmjereniGraf() {}
  82. virtual int dajBrojCvorova() = 0;
  83. virtual void postaviBrojCvorova(int brojCvorova) = 0;
  84. virtual void dodajGranu (int polazni, int dolazni, float tezina) = 0;
  85. virtual void obrisiGranu (int polazni, int dodajGranu) = 0;
  86. virtual void postaviTezinuGrane (int polazni, int dolazni, float tezina) = 0;
  87. virtual float dajTezinuGrane (int polazni, int dolazni) = 0;
  88. virtual bool postojiGrana (int polazni, int dolazni) = 0;
  89. virtual void postaviOznakuCvora (int cvor, TipOznake oznaka) = 0;
  90. virtual TipOznake dajOznakuCvora (int cvor) const = 0;
  91. virtual void postaviOznakuGrane (int polazni, int dolazni, TipOznake oznaka) = 0;
  92. virtual TipOznake dajOznakuGrane (int polazni, int dolazni) = 0;
  93.  
  94. Grana<TipOznake> dajGranu (int polazni, int dolazni) {
  95. return Grana<TipOznake>(this, polazni, dolazni);
  96. }
  97.  
  98. Cvor<TipOznake> dajCvor (int cvor) {
  99. return Cvor<TipOznake>(this, cvor);
  100. }
  101.  
  102. virtual GranaIterator<TipOznake> dajGranePocetak() = 0;
  103. virtual GranaIterator<TipOznake> dajGraneKraj() = 0;
  104. virtual GranaIterator<TipOznake> dajSljedecuGranu(int polazni, int dolazni) = 0;
  105. };
  106.  
  107.  
  108. template <typename TipOznake>
  109. class GranaIterator {
  110.  
  111. UsmjereniGraf<TipOznake>* graf;
  112. int polazni, dolazni;
  113.  
  114. public:
  115.  
  116.  
  117. GranaIterator(UsmjereniGraf<TipOznake>* graf, int polazni, int dolazni) :
  118. graf(graf), polazni(polazni), dolazni(dolazni) {}
  119.  
  120. Grana<TipOznake> operator*() {
  121. return Grana<TipOznake>(graf, polazni, dolazni);
  122. }
  123.  
  124.  
  125. bool operator == (const GranaIterator &iter) const {
  126. return (graf == iter.graf && polazni == iter.polazni && dolazni == iter.dolazni);
  127. }
  128.  
  129.  
  130. bool operator != (const GranaIterator &iter) const {
  131. return !(*this == iter);
  132. }
  133.  
  134.  
  135. GranaIterator& operator ++() {
  136. if (polazni == -1 && dolazni == -1) throw ("Iterator pokazuje iza kraja!");
  137. GranaIterator g = graf->dajSljedecuGranu(polazni, dolazni);
  138. polazni = g.polazni;
  139. dolazni = g.dolazni;
  140. return *this;
  141. }
  142.  
  143.  
  144. GranaIterator operator ++(int) {
  145. GranaIterator temp = *this;
  146. ++(*this);
  147. return temp;
  148. }
  149.  
  150. };
  151.  
  152.  
  153. template <typename TipOznake>
  154. class MatricaGraf : public UsmjereniGraf<TipOznake> {
  155.  
  156. struct PodaciGrane {
  157. TipOznake oznaka;
  158. float tezina;
  159. bool postoji;
  160. };
  161.  
  162. std::vector<std::vector<PodaciGrane>> matrica;
  163. std::vector<TipOznake> oznakeCvorova;
  164.  
  165. public:
  166.  
  167. MatricaGraf(int brojCvorova) : UsmjereniGraf<TipOznake>(brojCvorova) {
  168. postaviBrojCvorova(brojCvorova);
  169. }
  170.  
  171.  
  172. int dajBrojCvorova() {
  173. return matrica.size();
  174. }
  175.  
  176.  
  177. void postaviBrojCvorova(int brojCvorova) {
  178. if (brojCvorova < matrica.size()) throw ("Zabranjeno smanjenje broja cvorova!");
  179.  
  180. PodaciGrane nepostojeca;
  181. nepostojeca.postoji = false;
  182.  
  183. for (int i = 0; i < matrica.size(); i++)
  184. matrica[i].resize(brojCvorova, nepostojeca);
  185.  
  186. std::vector<PodaciGrane> prazanRed(brojCvorova, nepostojeca);
  187. matrica.resize(brojCvorova, prazanRed);
  188. oznakeCvorova.resize(brojCvorova, TipOznake());
  189. }
  190.  
  191. void dodajGranu (int polazni, int dolazni, float tezina) {
  192. PodaciGrane g;
  193. g.tezina = tezina;
  194. g.postoji = true;
  195. matrica[polazni][dolazni] = g;
  196. }
  197.  
  198.  
  199. void obrisiGranu (int polazni, int dolazni) {
  200. matrica[polazni][dolazni].postoji = false;
  201. }
  202.  
  203.  
  204. void postaviTezinuGrane (int polazni, int dolazni, float tezina) {
  205. matrica[polazni][dolazni].tezina = tezina;
  206. }
  207.  
  208.  
  209. float dajTezinuGrane (int polazni, int dolazni) {
  210. return matrica[polazni][dolazni].tezina;
  211. }
  212.  
  213.  
  214. bool postojiGrana (int polazni, int dolazni) {
  215. return matrica[polazni][dolazni].postoji;
  216. }
  217.  
  218.  
  219. void postaviOznakuCvora (int cvor, TipOznake oznaka) {
  220. oznakeCvorova[cvor] = oznaka;
  221. }
  222.  
  223.  
  224. TipOznake dajOznakuCvora (int cvor) const {
  225. return oznakeCvorova[cvor];
  226. }
  227.  
  228.  
  229. void postaviOznakuGrane (int polazni, int dolazni, TipOznake oznaka) {
  230. matrica[polazni][dolazni].oznaka = oznaka;
  231. }
  232.  
  233.  
  234. TipOznake dajOznakuGrane (int polazni, int dolazni) {
  235. return matrica[polazni][dolazni].oznaka;
  236. }
  237.  
  238.  
  239. GranaIterator<TipOznake> dajGranePocetak() {
  240. GranaIterator<TipOznake> it(this, 0, -1);
  241. return ++it;
  242. }
  243.  
  244.  
  245. GranaIterator<TipOznake> dajGraneKraj() {
  246. GranaIterator<TipOznake> it(this, -1, -1);
  247. return it;
  248. }
  249.  
  250.  
  251. GranaIterator<TipOznake> dajSljedecuGranu(int polazni, int dolazni) {
  252. for (int i = polazni; i < matrica.size(); i++) {
  253. for (int j = 0; j < matrica.size(); j++) {
  254. if (i == polazni && j <= dolazni) continue;
  255. if (matrica[i][j].postoji)
  256. return GranaIterator<TipOznake>(this, i, j);
  257. }
  258. }
  259. return GranaIterator<TipOznake>(this, -1, -1);
  260. }
  261. };
  262.  
  263.  
  264. template <typename TipOznake>
  265. void dfs (UsmjereniGraf<TipOznake>* &g, std::vector<Cvor<TipOznake>> &dfsPretraga, Cvor<TipOznake> cvor) {
  266. static std::vector<bool> posjeceni (g->dajBrojCvorova(), false);
  267. posjeceni[cvor.dajRedniBroj()] = true;
  268.  
  269. dfsPretraga.push_back(cvor);
  270.  
  271. int i = cvor.dajRedniBroj();
  272. for (int j = 0; j < g->dajBrojCvorova(); j++)
  273. if (g->postojiGrana(i, j) && !posjeceni[j]) dfs(g, dfsPretraga, g->dajCvor(j));
  274.  
  275. }
  276.  
  277.  
  278. template <typename TipOznake>
  279. void bfs (UsmjereniGraf<TipOznake>* &g, std::vector<Cvor<TipOznake>> &bfsPretraga, Cvor<TipOznake> cvor) {
  280. static std::vector<bool> posjeceni (g->dajBrojCvorova(), false);
  281.  
  282. std::vector<bool> susjedi(g->dajBrojCvorova(), false);
  283.  
  284. int i = cvor.dajRedniBroj();
  285.  
  286. if (!posjeceni[i]) {
  287. bfsPretraga.push_back(cvor);
  288. posjeceni[i] = true;
  289. }
  290.  
  291. for (int j = 0; j < g->dajBrojCvorova(); j++) {
  292. if (g->postojiGrana(i, j)) {
  293. if (!posjeceni[j]) {
  294. bfsPretraga.push_back(g->dajCvor(j));
  295. posjeceni[j] = true;
  296. susjedi[j] = true;
  297. }
  298. }
  299. }
  300.  
  301. for (int j = 0; j < posjeceni.size(); j++) {
  302. if (susjedi[j]) {
  303. bfs(g, bfsPretraga, g->dajCvor(j));
  304. }
  305. }
  306.  
  307. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement