Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- template <typename TipOznake>
- class UsmjereniGraf;
- template <typename TipOznake>
- class Cvor {
- UsmjereniGraf<TipOznake> *graf;
- int redni_broj;
- public:
- Cvor(UsmjereniGraf<TipOznake> *graf, int redni_broj) : graf(graf), redni_broj(redni_broj) {}
- TipOznake dajOznaku() const { return graf->dajOznakuCvora(redni_broj); }
- void postaviOznaku(TipOznake oznaka) { graf->postaviOznakuCvora(redni_broj, oznaka); }
- int dajRedniBroj() const { return redni_broj; }
- };
- template <typename TipOznake>
- class Grana {
- UsmjereniGraf<TipOznake> *graf;
- int polazni, dolazni;
- public:
- Grana(UsmjereniGraf<TipOznake> *graf, int polazni, int dolazni) : graf(graf), polazni(polazni), dolazni(dolazni) {}
- float dajTezinu() const { return graf->dajTezinuGrane(polazni, dolazni); }
- void postaviTezinu(float tezina) { graf->postaviTezinuGrane(polazni, dolazni, tezina); }
- TipOznake dajOznaku() const { return graf->dajOznakuGrane(polazni, dolazni); }
- void postaviOznaku(TipOznake oznaka) { graf->postaviOznakuGrane(polazni, dolazni, oznaka); }
- Cvor<TipOznake> dajPolazniCvor() const { return graf->dajCvor(polazni); }
- Cvor<TipOznake> dajDolazniCvor() const { return graf->dajCvor(dolazni); }
- };
- template <typename TipOznake>
- class GranaIterator {
- friend class UsmjereniGraf<TipOznake>;
- UsmjereniGraf<TipOznake> *graf;
- int polazni, dolazni;
- bool zadnja;
- public:
- GranaIterator(UsmjereniGraf<TipOznake> *graf, int polazni, int dolazni) : graf(graf), polazni(polazni), dolazni(dolazni), zadnja(false) {}
- GranaIterator(const GranaIterator &g){
- graf = g.graf;
- polazni = g.polazni;
- dolazni = g.dolazni;
- }
- GranaIterator &operator=(const GranaIterator &g){
- if(g != *this){
- graf = g.graf;
- polazni = g.polazni;
- dolazni = g.dolazni;
- }
- return *this;
- }
- Grana<TipOznake> operator*() { return Grana<TipOznake>(graf, polazni, dolazni); }
- bool operator==(const GranaIterator &iter) const{
- if(graf == iter.graf && polazni == iter.polazni && dolazni == iter.dolazni && zadnja == iter.zadnja) return true;
- return false;
- }
- bool operator!=(const GranaIterator &iter) const{
- if(graf == iter.graf && polazni == iter.polazni && dolazni == iter.dolazni && zadnja == iter.zadnja) return false;
- return true;
- }
- GranaIterator& operator++(){
- if(zadnja == true){
- zadnja = false;
- return *this;
- }
- if(polazni == graf->dajBrojCvorova() -1 && dolazni == graf->dajBrojCvorova() -1) throw "Kraj petlje";
- int tmp_polazni(polazni);
- int tmp_dolazni(dolazni);
- if(tmp_dolazni < graf->dajBrojCvorova() - 1) tmp_dolazni++;
- else if(tmp_dolazni == graf->dajBrojCvorova() -1) { tmp_polazni++; tmp_dolazni = 0; }
- for(int i = tmp_polazni; i < graf->dajBrojCvorova(); i++){
- for(int j = tmp_dolazni; j < graf->dajBrojCvorova(); j++){
- if(graf->postojiGrana(i, j)){
- dolazni = j;
- polazni = i;
- if(*this == graf->dajGraneKraj()) zadnja = true;
- return *this;
- }
- }
- tmp_dolazni = 0;
- }
- throw "Kraj grafa";
- }
- GranaIterator operator++(int){
- if(zadnja == true){
- zadnja = false;
- return *this;
- }
- if(polazni == graf->dajBrojCvorova() -1 && dolazni == graf->dajBrojCvorova() -1) throw "Kraj petlje";
- GranaIterator g(*this);
- int tmp_polazni(polazni);
- int tmp_dolazni(dolazni);
- if(tmp_dolazni < graf->dajBrojCvorova() - 1) tmp_dolazni++;
- else if(tmp_dolazni == graf->dajBrojCvorova() -1) { tmp_polazni++; tmp_dolazni = 0; }
- for(int i = tmp_polazni; i < graf->dajBrojCvorova(); i++){
- for(int j = tmp_dolazni; j < graf->dajBrojCvorova(); j++){
- if(graf->postojiGrana(i, j)){
- dolazni = j;
- polazni = i;
- if(*this == graf->dajGraneKraj()) zadnja = true;
- return g;
- }
- }
- tmp_dolazni = 0;
- }
- throw "Kraj grafa";
- }
- };
- template <typename TipOznake>
- class UsmjereniGraf{
- public:
- UsmjereniGraf(int brCvorova) {}
- virtual ~UsmjereniGraf() {}
- UsmjereniGraf(const UsmjereniGraf &g) {}
- //UsmjereniGraf operator=(const UsmjereniGraf &g);
- virtual int dajBrojCvorova() const = 0;
- virtual void postaviBrojCvorova(int noviBrojCvorova) = 0;
- virtual void dodajGranu(int polazni, int dolazni, float tezina = 0) = 0;
- virtual void obrisiGranu(int polazni, int dolazni) = 0;
- virtual void postaviTezinuGrane(int polazni, int dolazni, float tezina) = 0;
- virtual float dajTezinuGrane(int polazni, int dolazni) = 0;
- virtual bool postojiGrana(int polazni, int dolazni) = 0;
- virtual void postaviOznakuCvora(int brojCvora, TipOznake oznaka) = 0;
- virtual TipOznake dajOznakuCvora(int brojCvora) = 0;
- virtual void postaviOznakuGrane(int polazni, int dolazni, TipOznake oznaka) = 0;
- virtual TipOznake dajOznakuGrane(int polazni, int dolazni) = 0;
- virtual Cvor<TipOznake> dajCvor(int broj_cvorova) = 0;
- virtual Grana<TipOznake> dajGranu(int polazni, int dolazni) = 0;
- virtual GranaIterator<TipOznake> dajGranePocetak() = 0;
- virtual GranaIterator<TipOznake> dajGraneKraj() = 0;
- };
- template <typename TipOznake>
- class MatricaGraf : public UsmjereniGraf<TipOznake> {
- std::vector<std::vector<float>> cvorovi;
- std::vector<std::vector<TipOznake>> oznaka_grane;
- std::vector<std::vector<bool>> grana_postoji;
- std::vector<TipOznake> oznaka_cvora;
- int broj_grana;
- public:
- MatricaGraf(int brCvorova) : cvorovi(brCvorova, std::vector<float>(brCvorova, 0.)), oznaka_grane(brCvorova, std::vector<TipOznake>(brCvorova)),
- grana_postoji(brCvorova, std::vector<bool>(brCvorova, false)), oznaka_cvora(brCvorova), UsmjereniGraf<TipOznake>(brCvorova) {}
- void postaviBrojCvorova(int noviBrojCvorova){
- if(noviBrojCvorova < cvorovi.size())
- throw "Nije moguce smanjiti graf";
- cvorovi.resize(noviBrojCvorova);
- oznaka_cvora.resize(noviBrojCvorova);
- oznaka_grane.resize(noviBrojCvorova);
- grana_postoji.resize(noviBrojCvorova);
- for(int i = 0; i < noviBrojCvorova; i++){
- cvorovi[i].resize(noviBrojCvorova);
- oznaka_grane[i].resize(noviBrojCvorova);
- grana_postoji[i].resize(noviBrojCvorova);
- }
- }
- int dajBrojCvorova() const { return cvorovi.size(); }
- void dodajGranu(int polazni, int dolazni, float tezina = 0){
- if(polazni > cvorovi.size() || polazni < 0 || dolazni > cvorovi.size() || dolazni < 0) throw "Neispravni parametri";
- grana_postoji[polazni][dolazni] = true;
- cvorovi[polazni][dolazni] = tezina;
- broj_grana++;
- }
- void obrisiGranu(int polazni, int dolazni){
- if(polazni > cvorovi.size() || polazni < 0 || dolazni > cvorovi.size() || dolazni < 0) throw "Neispravni parametri";
- if(grana_postoji[polazni][dolazni]){
- grana_postoji[polazni][dolazni] = false;
- broj_grana--;
- cvorovi[polazni][dolazni] = 0;
- }
- }
- void postaviTezinuGrane(int polazni, int dolazni, float tezina){
- if(polazni > cvorovi.size() || polazni < 0 || dolazni > cvorovi.size() || dolazni < 0) throw "Neispravni parametri";
- if(!grana_postoji[polazni][dolazni]) throw "Grana ne postoji";
- cvorovi[polazni][dolazni] = tezina;
- }
- float dajTezinuGrane(int polazni, int dolazni){
- if(polazni > cvorovi.size() || polazni < 0 || dolazni > cvorovi.size() || dolazni < 0) throw "Neispravni parametri";
- if(!grana_postoji[polazni][dolazni]) throw "Grana ne postoji";
- return cvorovi[polazni][dolazni];
- }
- bool postojiGrana(int polazni, int dolazni){
- if(polazni > cvorovi.size() || polazni < 0 || dolazni > cvorovi.size() || dolazni < 0) throw "Neispravni parametri";
- return grana_postoji[polazni][dolazni];
- }
- void postaviOznakuCvora(int brojCvora, TipOznake oznaka){
- if(brojCvora < 0 || brojCvora > cvorovi.size() - 1) throw "Neispravan parametar";
- oznaka_cvora[brojCvora] = oznaka;
- }
- TipOznake dajOznakuCvora(int brojCvora){
- if(brojCvora < 0 || brojCvora > cvorovi.size() - 1) throw "Neispravan parametar";
- return oznaka_cvora[brojCvora];
- }
- void postaviOznakuGrane(int polazni, int dolazni, TipOznake oznaka){
- if(polazni > cvorovi.size() || polazni < 0 || dolazni > cvorovi.size() || dolazni < 0) throw "Neispravni parametri";
- if(!grana_postoji[polazni][dolazni]) throw "Ne postoji grana";
- oznaka_grane[polazni][dolazni] = oznaka;
- }
- TipOznake dajOznakuGrane(int polazni, int dolazni){
- if(polazni > cvorovi.size() || polazni < 0 || dolazni > cvorovi.size() || dolazni < 0) throw "Neispravni parametri";
- if(!grana_postoji[polazni][dolazni]) throw "Ne postoji grana";
- return oznaka_grane[polazni][dolazni];
- }
- Cvor<TipOznake> dajCvor(int broj_cvorova){
- if(broj_cvorova < 0 || broj_cvorova > cvorovi.size() - 1) throw "Neispravan parametar";
- return Cvor<TipOznake>(this, broj_cvorova);
- }
- Grana<TipOznake> dajGranu(int polazni, int dolazni){
- if(polazni > cvorovi.size() || polazni < 0 || dolazni > cvorovi.size() || dolazni < 0) throw "Neispravni parametri";
- if(!grana_postoji[polazni][dolazni]) throw "Ne postoji grana";
- return Grana<TipOznake>(this, polazni, dolazni);
- }
- GranaIterator<TipOznake> dajGranePocetak(){
- for(int i = 0; i < cvorovi.size(); i++){
- for(int j = 0; j < cvorovi.size(); j++){
- if(grana_postoji[i][j]) return GranaIterator<TipOznake>(this, i, j);
- }
- }
- throw "Ne postoji grana";
- }
- GranaIterator<TipOznake> dajGraneKraj(){
- for(int i = grana_postoji.size() - 1; i >= 0; i--)
- for(int j = grana_postoji.size() - 1; j >= 0; j--)
- if(grana_postoji[i][j]) return GranaIterator<TipOznake>(this, i, j);
- throw "Ne postoji grana";
- }
- };
- int main() {
- try {
- UsmjereniGraf<bool> *g = new MatricaGraf<bool>(3);
- g->dodajGranu(0, 1, 2.5);
- g->dodajGranu(1, 0, 1.2);
- g->dodajGranu(1, 2, 0.1);
- g->dodajGranu(0, 0, 3.14);
- for (GranaIterator<bool> iter = g->dajGranePocetak();
- iter != g->dajGraneKraj(); ++iter)
- std::cout << (*iter).dajPolazniCvor().dajRedniBroj() << " "
- << (*iter).dajDolazniCvor().dajRedniBroj() << " "
- << (*iter).dajTezinu() << std::endl;
- delete g;
- } catch (const char izuzetak[]) {
- std::cout << izuzetak << std::endl;
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement