» »

[C++] Iskanje v globino

[C++] Iskanje v globino

minghags ::

Lep pozdrav!

Imam funkcijo za iskanje v širino ampak moram pa še narediti iskanje v globino. Ker mi koncept ni točno jasen, bi mi lahko mogoče kdo pomagal?

Koda:

void iskanjeVSirino(int* matrika, int* barva, int* razdalja, int* predhodnik, int velikost, int s) 
{
	queue<int> Q; 
	
    
	for(int i=0; i<velikost; i++) 
    {
		barva[i] = bela;
		razdalja[i] = inf; 
		predhodnik[i] = nil;
	}
	
	
	barva[s] = siva; 
	razdalja[s] = 0; 
	Q.push(s); 
	
	
	while(Q.empty() == false) 
    {
		int v = Q.front(); 
		Q.pop();
		
		int ePrvi = v*velikost; 
		int eZadnji = ePrvi+velikost; 
		for(int e=ePrvi; e<eZadnji; e++) 
        {
			if(matrika[e] == 1) 
            {
				int u = e-ePrvi;
				if(barva[u] == bela) 
                {
					barva[u] = siva; 
					razdalja[u] = razdalja[v]+1;
					predhodnik[u] = v;
					Q.push(u);
				}
			}
		}
		barva[v] = crna;
	}
}

genesiss ::

Edina razlika med BFS in DFS je, da DFS uporablja sklad (stack) BFS pa vrsto (queue). Naredi eno drevo na roke, boš videl v čem je fora.

Zgodovina sprememb…

  • spremenil: genesiss ()

minghags ::

Saj pravzaprav razumem, nevem pa sintakse kako bi spisal... Hvala za odgovor

genesiss ::

Sintakso imaš v dokumentaciji: http://www.cplusplus.com/reference/stl/...
S primeri, recimo za pop: http://www.cplusplus.com/reference/stl/...

 Stack vs queue

Stack vs queue

Ciklamen ::

Pozdrav.

Tudi jaz se ubadam s tem iskanjem v globino, do sedaj sem prišel gor s tem:

void IskanjeVSirino(Vozlisce G[], Vozlisce zac, int** sosednji, Vozlisce Q[]) {
	for(int i=0; i<=velikost; i++) {
		G[i].ime = i;
		G[i].status = 0;
		G[i].dolzina = 100;
		G[i].predhodnik = -1;
	}
	zac.status = 1;
	zac.dolzina = 0;
	zac.predhodnik = -1;

        mystack.push(zac);
 	//Vpisi(Q, *z);
	while(mystack.empty()!=0) {
        Vozlisce pregled = mystack.top();
        //Vozlisce top = mystack.top();
	    mystack.pop();
		glava++;
		for(int i=0; i<=velikost; i++) {
			if(sosednji[pregled.ime][i] == 1) {
				if(G[i].status==0) {
					G[i].status=1;
					G[i].dolzina = pregled.dolzina+1;
					G[i].predhodnik = pregled.ime;
					//Vpisi(Q, G[i]);
					mystack.push(G[i]);
				}
			}
		}
		pregled.status = 2;
	}
}


Verjamem da je koda grda, ampak razbijam si glavo in ne vem kako naj iz BFS v DFS spremenim (ignorirajte komentarje, ti so tam ker je koda iz BFS-a)
- End of the Post ->

Ciklamen ::

Ignore moj zgornji post:

void IskanjeVSirino(Vozlisce G[], Vozlisce *zac, int** sosednji, Vozlisce Q[]) {
	for(int i=0; i<=velikost; i++) {
		G[i].ime = i;
		G[i].status = 0;
		G[i].dolzina = 100;
		G[i].predhodnik = -1;
	}
	(*zac).status = 1;
	(*zac).dolzina = 0;
	(*zac).predhodnik = -1;
	
	Q[tr_sklad]=(*zac);
	tr_sklad++;

	//Vpisi(Q, *z);
	while(tr_sklad!=0) {
        Vozlisce pregled = Q[tr_sklad];
        
        Q[tr_sklad].ime=NULL;
        Q[tr_sklad].dolzina=NULL;
        Q[tr_sklad].predhodnik=NULL;
        Q[tr_sklad].status=NULL;
		tr_sklad--;
		
		for(int i=0; i<=velikost; i++) {
			if(sosednji[pregled.ime][i] == 1) {
				if(G[i].status==0) {
					G[i].status=1;
					G[i].dolzina = pregled.dolzina+1;
					G[i].predhodnik = pregled.ime;
					//Vpisi(Q, G[i]);
					Q[tr_sklad]=G[i];
					tr_sklad++;
				}
			}
		}
		pregled.status = 2;
	}
	cout<<"Drevo vozlisc je ustvarjeno."<<endl;
}
void Izpis(Vozlisce G[], Vozlisce zac, Vozlisce pot, int dolzina, int konec, int zacetek) {
	    if(zac.ime == pot.ime) {
		    cout<<"Dolzina poti od "<<zacetek<<" do "<<konec<<" je "<<dolzina<<endl;
            cout<<endl;
            cout<<zac.ime;
	    } else {
		    if(pot.predhodnik == -1) {
			    cout<<"Med vozliscem "<<zacetek<<" in "<<konec<<" ni povezave."<<endl;
            } else {
			    Izpis(G, zac, G[pot.predhodnik], dolzina, konec, zacetek);
			    cout<<" -- "<<pot.ime;
	    	}
	    }
}


Namesto stack-a vgrajenega v C++ sem uporabil tabelo, ampak problem je, da program se izvede, ampak ne najde mi pa poti med vozlišči. (vedno izpiše, da ni poti med vozliščema)
- End of the Post ->

Ciklamen ::

A res nihče nima namiga? Res se mi gre za to nalogo da jo naredim do konca, ker se mi nenazadnje gre tudi za letnik. Sam ne vem več kaj naj mrdam, bolj kot gledam kje bi lahko kaj spremenil, manj mi je jasno..

Domnevam da nekje v tem stacku, da ne gre iz stacka ven pobirat.

Če hočete lahko še celo kodo pripišem (če bo lažje za prebrat zadeve?)
- End of the Post ->

Spura ::

Iskanje v globino ni sprememba iskanja v sirino, ampak cisto drug algoritem. Napisi z nule. Iskanje v globino je celo lazje, ker je naravno reprezentirano v rekurziji funkcij.

darkkk ::

Res je lažje, ampak če ma že vse ostalo napisano mora samo namesto vrste tja noter podstavit sklad (enako se naložijo rekurzivni klici funkcij)


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

[VB.NET] class

Oddelek: Programiranje
8703 (610) korenje3
»

[JAVA] algoritem za iskanje....{nujno!}

Oddelek: Programiranje
5863 (737) gtramt1
»

C - pomoč

Oddelek: Programiranje
111435 (1175) Thagirion
»

[C++] Knapsack - pravokotniki

Oddelek: Programiranje
8924 (785) Gundolf
»

Programiranje "Šah-a" v Javi

Oddelek: Programiranje
264197 (3713) OwcA

Več podobnih tem