Pagini: [1]   În jos
  Imprimă  
Ajutor Subiect: Algoritm Lee Clasic Coada  (Citit de 5414 ori)
0 Utilizatori şi 1 Vizitator pe acest subiect.
popoiu.george
Vorbaret
****

Karma: 19
Deconectat Deconectat

Mesaje: 162



Vezi Profilul
« : Iulie 14, 2009, 12:33:42 »

Am dat peste o problema la care se spunea ca se rezolva folosind Lee clasic cu o Coada.

Am cautat pe google ceva teorie dar nu prea am gasit, daca aveti vreun link sau stiti algoritmul si vreti sa mi-l explicati as fi mai mult decat recunoscator  Very Happy wink

Multumesc Anticipat !!!
Memorat
CezarMocan
Nu mai tace
*****

Karma: 252
Deconectat Deconectat

Mesaje: 567



Vezi Profilul
« Răspunde #1 : Iulie 14, 2009, 14:07:14 »

"Lee clasic cu coada" inseamna de fapt o parcurgere in latime a unei matrici. Daca nu stii parcurgere in latime uita-te peste problema din Arhiva Educationala. Spor!
Memorat
alexandru92
Nu mai tace
*****

Karma: -191
Deconectat Deconectat

Mesaje: 496



Vezi Profilul
« Răspunde #2 : August 07, 2009, 07:52:34 »

Lee sau un BFS, e chiar usor de facut:
1. alegi un varf de plecare ( in general 1 )
2. pui varful in coada
3. cat timp coada nu este vida
   4. extragi primul element.
   5. determini toti  vecini lui x care nu au fost vizitati si ii pui in coada, marcandui ca vizitati Smile
   6. revi la pasul 3
5. continuie programul cu ce trebuie Wink
Implementarea, o sa folosesc putin stl pentru rapiditate
Cod:
#include <fstream>
#include <queue>  //pentru coada
#include <bitset> // pentru a retine matricea de adiacenta avem nevoie doar de o matrice de biti ( 1 sau 0 )
#define Nmax 301
using namespace std;
ifstream in;
ofstream out;
bitset<Nmax> v[Nmax], uz; //in v - retin matricea de adiacenta si in uz ce varf a fost vizitat
queue<int> Q; //coada
int main()
{int N,M,x,y,i;
    in.open("lee.in");;
    in>>N>>M; // N - numarul de varfuri , M- numarul de muchii
    while( M -- ) 
    {
              in>>x>>y; 
             v[x].flip(y); v[y].flip(x);  //marchez v[x][y]=v[y][x]=1
    }
    Q.push(1); // inserez 1 in coada
    uz.flip(1);
    out.open("lee.out");
    while( !Q.empty() ) //3
    {
              x=Q.front(); Q.pop(); //4
              for( i=1; i<=N; ++i )  //5
                 if( v[x][i] && !uz[i] )
                 {
                         Q.push(i); uz.flip(i);
                 }
    }
     //restul programului
     return 0;
}
Sper ca fost de ajutor Wink
Memorat
sabbath
Strain


Karma: 0
Deconectat Deconectat

Mesaje: 5



Vezi Profilul
« Răspunde #3 : Februarie 08, 2012, 22:44:27 »

si eu am o problema, plec dintr-un punct si tre' sa ajung in altul. nu prea reusesc. iau o matr viz si pun 1 cand am trecut pe acolo, dar nu stiu cum sa adun in matricea data astfel incat sa fac suma maxima pe cel mai scurt drum pentru a iesi din matrice

Cod:
int Lee()
{
    struct coord{
        int x, y;
    } c[101*101];

    c[0].x = si;
    c[0].y = sj;
    a[si][sj] = 0;//nu stiu ce val sa pun
    viz[si][sj] = 1;//am vizitat
    int p=0,u=0;
    while(p<=u)
    {
        int x1 = c[p].x;
        int y1 = c[p].y;
        for(int k = 0;k<4;k++)
        {
            int xv = x1 + dx[k];
            int yv = y1 + dy[k];
            if(a[xv][yv] > a[x1][y1] && viz[xv][yv] == 0)
                {
                    u++;
                    c[u].x = xv;
                    c[u].y = yv;
                    a[xv][yv] += a[x1][y1];
                }
        }
        cout<<x1<<" "<<y1<<endl;
        if (x1== -1 && y1 == -1)
            return -2;
        p++;
    }
    return -1;
}

ma ajuta orice indicatie.inca nu am clar procedeul de rezolvare, ce sa fac in matricea initiala?

Multumesc anticipat!

Editat de admin: Foloseste tagul "code" cand postezi surse.
« Ultima modificare: Februarie 08, 2012, 23:13:35 de către Andrei Grigorean » Memorat
Pagini: [1]   În sus
  Imprimă  
 
Schimbă forumul:  

Powered by SMF 1.1.19 | SMF © 2006-2013, Simple Machines