You are on page 1of 4

#include <iostream>

#include <vector>
#include <stdexcept>

using std::cin;
using std::cout;
using std::endl;

template<typename TipOznake>
class UsmjereniGraf;

template<typename TipOznake>
*class Cvor{
UsmjereniGraf<TipOznake>* graf;
int brojC;
public:
Cvor(UsmjereniGraf<TipOznake>* g, int broj): graf(g), brojC(broj) {}
int dajRedniBroj() const { return brojC; }
TipOznake dajOznaku() const { return graf->dajOznakuCvora(brojC); }
void postaviOznaku(TipOznake o){
graf->postaviOznakuCvora(brojC, o);
}
};

template<typename TipOznake>
*class Grana{
UsmjereniGraf<TipOznake>* graf;
int polazni;
int dolazni;
public:
Grana(UsmjereniGraf<TipOznake>*graf, int p, int d): graf(graf), polazni(p),
dolazni(d) {}
*float dajTezinu() const { return graf->dajTezinuGrane(polazni, dolazni); }
*void postaviTezinu(float t) { graf->postaviTezinuGrane(polazni, dolazni, t); }
*TipOznake dajOznaku() const { return graf->dajOznakuGrane(polazni, dolazni); }
*void postaviOznaku(TipOznake o) { graf->postaviOznakuGrane(polazni, dolazni,
o); }
*Cvor<TipOznake> dajPolazniCvor() const { return graf->dajCvor(polazni); }
*Cvor<TipOznake> dajDolazniCvor() const { return graf->dajCvor(dolazni); }

};

template<typename TipOznake>
*class GranaIterator{
UsmjereniGraf<TipOznake>* graf;
int polazni;
int dolazni;
public:
GranaIterator(UsmjereniGraf<TipOznake>* graf, int p, int d): graf(graf),
polazni(p), dolazni(d) {}
Grana<TipOznake> operator*() { return graf->dajGranu(polazni, dolazni); }
bool operator==(const GranaIterator &i) const {
bool d(false);
if(graf==i.graf && polazni==i.polazni && dolazni==i.dolazni) d=true;
return d;
}
bool operator!=(const GranaIterator &i) const {
bool d(false);
if(graf==i.graf && polazni==i.polazni && dolazni==i.dolazni) d=true;
return !d;
}
GranaIterator &operator ++(){
if(polazni==-1 && dolazni==-1){
polazni=0;
dolazni=-1;
}
GranaIterator granaI=graf->dajSljedecuGranu(polazni, dolazni);
polazni=granaI.polazni;
dolazni=granaI.dolazni;
return *this;
}
GranaIterator operator ++(int){
GranaIterator it(*this);
++(*this);
return it;
}
};

template<typename TipOznake>
*class UsmjereniGraf{
public:
*UsmjereniGraf() {}
*UsmjereniGraf(int brojC) {}
*virtual int dajBrojCvorova() const=0;
*virtual void postaviBrojCvorova(int brojC)=0;
*virtual void dodajGranu(int polazni, int dolazni, float t)=0;
*virtual void obrisiGranu(int polazni, int dolazni)=0;
*virtual void postaviTezinuGrane(int polazni, int dolazni, float t)=0;
*virtual float dajTezinuGrane(int polazni, int dolazni) const=0;
*virtual bool postojiGrana(int polazni, int dolazni)=0;
*virtual void postaviOznakuCvora(int brojC, TipOznake o)=0;
*virtual TipOznake dajOznakuCvora(int cvor) const =0;
*virtual void postaviOznakuGrane(int polazni, int dolazni, TipOznake o)=0;
*virtual TipOznake dajOznakuGrane(int polazni, int dolazni) const =0;
*virtual Grana<TipOznake> dajGranu(int polazni, int dolazni) { return
Grana<TipOznake>(this, polazni, dolazni); }
///// virtual Cvor<TipOznake> dajCvor(int cvor) {return Cvor<TipOznake>(this,
cvor); }
*virtual GranaIterator<TipOznake> dajGranePocetak()=0;
*virtual GranaIterator<TipOznake> dajGraneKraj()=0;
virtual GranaIterator<TipOznake> dajSljedecuGranu(int polazni, int dolazni)=0;
virtual ~UsmjereniGraf() {}
};

template<typename TipOznake>
class MatricaGraf: public UsmjereniGraf<TipOznake>{
struct Inf{
float tezina;
TipOznake oznaka;
bool postoji;
};
std::vector<std::vector<Inf>>matrica;
std::vector<TipOznake> cOznake;
public:
*MatricaGraf(int brojC): UsmjereniGraf<TipOznake>(brojC){
matrica.resize(brojC);
cOznake.resize(brojC);
for(int i=0;i<brojC;i++){
matrica[i].resize(brojC);
for(int j=0;j<brojC;j++){
matrica[i][j].postoji=false;
}
}
}
*int dajBrojCvorova() const override { return matrica.size(); }
*void postaviBrojCvorova(int brojC) override {
if(brojC<matrica.size()) throw std::domain_error("Ne moze.");
std::vector<std::vector<Inf>>matp(brojC);
for(int i=0;i<brojC;i++){
matp.resize(brojC);
for(int j=0;j<brojC;j++){
matp[i][j].postoji=false;
}
}
for(int i=0;i<matrica.size();i++){
for(int j=0;j<matrica.size();j++){
matp[i][j]=matrica[i][j];
}
}
cOznake.resize(brojC);
}
*void dodajGranu(int polazni, int dolazni, float t) override{
Inf i;
i.tezina=t;
i.postoji=true;
matrica[polazni][dolazni]=i;
}
*void obrisiGranu(int polazni, int dolazni) override{
matrica[polazni][dolazni].postoji=false;
}
*void postaviTezinuGrane(int polazni, int dolazni, float t) override{
matrica[polazni][dolazni].tezina=t;
}
*float dajTezinuGrane(int polazni, int dolazni) const override {
return matrica[polazni][dolazni].tezina;
}
*bool postojiGrana(int polazni, int dolazni) override {
return matrica[polazni][dolazni].postoji;
}
*void postaviOznakuCvora(int brojC, TipOznake o) override {
cOznake[brojC]=o;
}
*TipOznake dajOznakuCvora(int cvor) const override {
return cOznake[cvor];
}
*void postaviOznakuGrane(int polazni, int dolazni, TipOznake o) override {
matrica[polazni][dolazni].oznaka=o;
}
*TipOznake dajOznakuGrane(int polazni, int dolazni) const override {
return matrica[polazni][dolazni].oznaka;
}
*Grana<TipOznake> dajGranu(int polazni, int dolazni) override {
return Grana<TipOznake>(this, polazni, dolazni);
}
Cvor<TipOznake> dajCvor(int cvor) override {
return Cvor<TipOznake>(this, cvor);
}
*GranaIterator<TipOznake> dajGranePocetak() override {
GranaIterator<TipOznake> granaI(this, 0, -1);
return ++granaI;
}
*GranaIterator<TipOznake> dajGraneKraj() override {
GranaIterator<TipOznake> granaI(this, -1, -1);
return granaI;
}
*GranaIterator<TipOznake> dajSljedecuGranu(int polazni, int dolazni) override {
for(int i=polazni;i<matrica.size();i++){
for(int j=0;j<matrica.size();j++){
if(i==polazni && j<=dolazni) continue;
if(matrica[i][j].postoji) return GranaIterator<TipOznake>(this, i,
j);
}
}
return GranaIterator<TipOznake>(this, -1, -1);
}
~MatricaGraf() {}
};

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)
cout << (*iter).dajPolazniCvor().dajRedniBroj() << " "<<
(*iter).dajDolazniCvor().dajRedniBroj() << " "<< (*iter).dajTezinu() << endl;
delete g;
} catch (const char izuzetak[]) {
cout << izuzetak << endl;
}

return 0;
}

You might also like