C++ grafy

Programovacie jazyky, rady, poradňa...
Carm@gedon
Light Expert
Light Expert
Príspevky: 47
Registrovaný: 07 dec 2006, 20:00

C++ grafy

Príspevok od používateľa Carm@gedon »

Ahojte,
chcel by som sa opytat ci mam dobre prehladavanie grafov...
Hlavne to do sirky sa mi nejak nezda.
Dik
http://paste.jabbim.cz/5657
metthal
Guru wannabe
Guru wannabe
Používateľov profilový obrázok
Príspevky: 2475
Registrovaný: 26 jan 2006, 18:32
Bydlisko: Nitra / Brno

Re: C++ grafy

Príspevok od používateľa metthal »

V tom prehladavani do hlbky absolutne nemusi byt riadok

Kód: Vybrať všetko

it->second->name="Prehladane!";
pretoze stav toho ze je to uz prehladany vrchol sa nastavi pri rekuzivnom volani dohlbky na riadku

Kód: Vybrať všetko

temp->name="Prehladane!";
osobne by som vsak preferoval nejaku bool hodnotu toho ci je to uz prehladany alebo neprehladany vrchol.

Co sa tyka prehladavania do sirky, tak nikde nevidim ze by si aktualnemu vrcholu nastavil hodnotu ze je uz prehladany. Taktiez som si vsak vsimol ze nastavujes hned vrcholu ze je prehladany, pricom je len spracovany a dany do fronty. Za riadok

Kód: Vybrať všetko

for(it=vrcholy.begin();it != vrcholy.end();it++)
dopln

Kód: Vybrať všetko

V->name = "Prehladane!";
a zmaz z toho cyklu prehladavania susedov riadok

Kód: Vybrať všetko

it->second->name="Prehladane!";
EDIT: A len taka optimalizacna vec, skus si zvyknut na zapis ++x namiesto x++. Taktiez k akemusi "standardu" patri ze sa nepristupuje priamo k clenom triedy. Tieto cleny by mali byt private/protected a mali by sa pouzivat metody na nastovavanie ich hodnot, alebo ziskanie ich hodnot. To len tak k okraju. :D
Carm@gedon
Light Expert
Light Expert
Príspevky: 47
Registrovaný: 07 dec 2006, 20:00

Re: C++ grafy

Príspevok od používateľa Carm@gedon »

-=wolf=- napísal:V tom prehladavani do hlbky absolutne nemusi byt riadok

Kód: Vybrať všetko

it->second->name="Prehladane!";
pretoze stav toho ze je to uz prehladany vrchol sa nastavi pri rekuzivnom volani dohlbky na riadku

Kód: Vybrať všetko

temp->name="Prehladane!";
osobne by som vsak preferoval nejaku bool hodnotu toho ci je to uz prehladany alebo neprehladany vrchol.

Co sa tyka prehladavania do sirky, tak nikde nevidim ze by si aktualnemu vrcholu nastavil hodnotu ze je uz prehladany. Taktiez som si vsak vsimol ze nastavujes hned vrcholu ze je prehladany, pricom je len spracovany a dany do fronty. Za riadok

Kód: Vybrať všetko

for(it=vrcholy.begin();it != vrcholy.end();it++)
dopln

Kód: Vybrať všetko

V->name = "Prehladane!";
a zmaz z toho cyklu prehladavania susedov riadok

Kód: Vybrať všetko

it->second->name="Prehladane!";
jj nemusi ...


inak to

Kód: Vybrať všetko

V->name = "Prehladane!";
mozem dat teoreticky aj za fronta.pop(); nie?
metthal
Guru wannabe
Guru wannabe
Používateľov profilový obrázok
Príspevky: 2475
Registrovaný: 26 jan 2006, 18:32
Bydlisko: Nitra / Brno

Re: C++ grafy

Príspevok od používateľa metthal »

Pockaj ja som sa teraz zamotal v nazvach tvojich premennych. Asi budem musiet nakoniec spustit ten CodeBlocks. Daj mi cas chvilu.

//autoeditácia príspevku (05 Máj 2012, 15:59)
Takto by to malo vyzerat, pisal som to vsak bez kompilatora takze za pripadne chyby nerucim. :|

Kód: Vybrať všetko

void do_sirky(Vertex* temp)
		{
			stack<Vertex*> fronta;
			set<Vertex*>::iterator it;
			fronta.push(temp);
			Vertex* V;

			while(!fronta.empty())
			{
				V=fronta.top();
				fronta.pop();

				if (V->name == "Prehladane!")
                    continue;

                V->name = "Prehladane!";

				for (it = V->susedia.begin(); it != V->susedia.end(); ++it)
				{
				    if ((*it)->name != "Prehladane!")
                        fronta.push(*it);
				}
			}
		}
Carm@gedon
Light Expert
Light Expert
Príspevky: 47
Registrovaný: 07 dec 2006, 20:00

Re: C++ grafy

Príspevok od používateľa Carm@gedon »

-=wolf=- napísal:Pockaj ja som sa teraz zamotal v nazvach tvojich premennych. Asi budem musiet nakoniec spustit ten CodeBlocks. Daj mi cas chvilu.

//autoeditácia príspevku (05 Máj 2012, 15:59)
Takto by to malo vyzerat, pisal som to vsak bez kompilatora takze za pripadne chyby nerucim. :|

Kód: Vybrať všetko

void do_sirky(Vertex* temp)
		{
			stack<Vertex*> fronta;
			set<Vertex*>::iterator it;
			fronta.push(temp);
			Vertex* V;

			while(!fronta.empty())
			{
				V=fronta.top();
				fronta.pop();

				if (V->name == "Prehladane!")
                    continue;

                V->name = "Prehladane!";

				for (it = V->susedia.begin(); it != V->susedia.end(); ++it)
				{
				    if ((*it)->name != "Prehladane!")
                        fronta.push(*it);
				}
			}
		}
dik, ale v podstate mam to iste, len ty si to napisal jednoduhsie nie?
metthal
Guru wannabe
Guru wannabe
Používateľov profilový obrázok
Príspevky: 2475
Registrovaný: 26 jan 2006, 18:32
Bydlisko: Nitra / Brno

Re: C++ grafy

Príspevok od používateľa metthal »

Ono skusil som tvoj program spustit, prehlada sice vsetky vrcholy ale robis to fakt divne. Zbytocne iteracie podla mna.
Napísať odpoveď