Pagini: [1] 2 3   În jos
  Imprimă  
Ajutor Subiect: 290 Gandaci Java  (Citit de 11798 ori)
0 Utilizatori şi 1 Vizitator pe acest subiect.
ditzone
Vizitator
« : Octombrie 15, 2006, 21:35:32 »

Aici puteţi discuta despre problema Gandaci Java.
Memorat
cristy
De-al casei
***

Karma: 2
Deconectat Deconectat

Mesaje: 136



Vezi Profilul
« Răspunde #1 : Octombrie 17, 2006, 18:31:05 »

un cercetator poate prinde mai multi gandaci?
Memorat

... lipsa de inspiratie ...
Marius
Nu mai tace
*****

Karma: 154
Deconectat Deconectat

Mesaje: 572



Vezi Profilul
« Răspunde #2 : Octombrie 17, 2006, 18:33:18 »

un cercetator poate prinde mai multi gandaci?

Nu.
Memorat

Faceti lucrurile simplu: pe cat de simplu posibil, dar nu mai simplu.
pocaitu
De-al casei
***

Karma: -26
Deconectat Deconectat

Mesaje: 141



Vezi Profilul
« Răspunde #3 : Noiembrie 06, 2006, 17:09:20 »

Problema mi s-a parut f simpla . Dupa mine nu e alceva decat un cuplaj maximal in graf bipartit .
 Dar cand m-am uitat la statistici  am ramas blocat  Shocked
 Care-i smenu , pana la urma ??
Memorat

This is not a signature ! I repeat, this is not a signature !
azotlichid
Echipa infoarena
Nu mai tace
*****

Karma: 50
Deconectat Deconectat

Mesaje: 260



Vezi Profilul
« Răspunde #4 : Noiembrie 06, 2006, 17:33:27 »

Incearca sa o implementezi si vei vedea  Mr. Green
Memorat
pocaitu
De-al casei
***

Karma: -26
Deconectat Deconectat

Mesaje: 141



Vezi Profilul
« Răspunde #5 : Noiembrie 06, 2006, 18:11:47 »

 Probabil ca va iesi din timp , altceva n-ar avea ce sa aiba .
 Nu prea vad de ce sa implementez degeaba ca sa vad ca imi iese din timp. Ma gandeam ca poate imi da cineva  care  a mai facut-o ,un hint.
   
Memorat

This is not a signature ! I repeat, this is not a signature !
Marius
Nu mai tace
*****

Karma: 154
Deconectat Deconectat

Mesaje: 572



Vezi Profilul
« Răspunde #6 : Noiembrie 06, 2006, 19:00:07 »

Eu nu am rezolvat problema dar cred ca se rezolva cu algoritmul Hopcroft Karp care determina cuplajul maxim in cel mult in N^1/2 pasi. Daca reusesti sa imi spui si mie!  Tongue
Memorat

Faceti lucrurile simplu: pe cat de simplu posibil, dar nu mai simplu.
devilkind
Echipa infoarena
Nu mai tace
*****

Karma: 284
Deconectat Deconectat

Mesaje: 1.240



Vezi Profilul
« Răspunde #7 : Noiembrie 06, 2006, 19:08:49 »

cred ca vrei sa zici n^2/2 nu n^1  Thumb up, am sa ma uit si eu dupa algoritm, eu am incercat cu flux si nu am fost asa surprins cand am vazut 0 fiind prima mea problema de cuplaj, insa am fost surprins ca nu era vorba de WA ci de TLE.
Memorat
bogdan2412
Echipa infoarena
Nu mai tace
*****

Karma: 410
Deconectat Deconectat

Mesaje: 951



Vezi Profilul
« Răspunde #8 : Noiembrie 06, 2006, 19:31:04 »

Ideea la baza algoritmului Hopcroft Karp e sa se augmenteze un set de lanturi alternante maximal la fiecare pas... Daca cunosti algoritmul de cuplare cu functia PairUp ( nu stiu numele oficial al algoritmului dar asa i se spune :p ) poti sa-l optimizezi si pe el sa mearga de 100 pe aceeasi idee.

set maximal de lanturi alternante = un set de lanturi alternante disjuncte care nu se mai poate mari adaugand alt lant (maximal != maxim)
Daca ai rabdarea sa cauti pe net despre hopcroft karp si lanturi alternante vei intelege mai bine Smile

devilkind: n^(1/2)
Memorat
sima_cotizo
Nu mai tace
*****

Karma: 219
Deconectat Deconectat

Mesaje: 596



Vezi Profilul
« Răspunde #9 : Februarie 05, 2007, 20:11:28 »

Am si eu o intrebare, se poate retine in vreun fel ce gandac cu ce cercetator sunt legati? ... Vreau sa zic ca am incercat cu liste de adiacenta, pe care dupa fiecare test le dealoc... si primesc Memory limit exceeded...  Surprised

Postez si functiile de adaugare si stergere la liste... nu stiu de ce dar cred ca acel "delete" nu face ca ce e alocat pointerului *p sa poata fi realocat mai incolo... Sad

Cod:
void add(long x, long y) {
    lista *p = new lista;
    p -> x = y;
    p -> n = G[x];
    G[x] = p;

}
void remove() {
    lista *p;
    long i;
    for (i=1; i<=N; ++i) {
        while ( G[i] ) {
            p = G[i];
            G[i] = G[i]->n;
            delete p;
        }
    }
}

unde "lista" = struct { long x, lista* n; } ...
Memorat
DITzoneC
Nu mai tace
*****

Karma: 301
Deconectat Deconectat

Mesaje: 962



Vezi Profilul
« Răspunde #10 : Februarie 05, 2007, 20:31:30 »

Par in regula functiile alea, esti sigur ca nu e de la altceva ... ?
Memorat
sima_cotizo
Nu mai tace
*****

Karma: 219
Deconectat Deconectat

Mesaje: 596



Vezi Profilul
« Răspunde #11 : Februarie 05, 2007, 21:58:08 »

Pai nu stiu daca aveti "Fundamentele programarii pt clasa XI" a doamnei Lica, dar acolo exista un programel dragut cuplaj... Care nu e cu flux. Eu zic ca l-am inteles destul de bine...
Ideea in program e ca odata ce am atribuit un gandac java unui cercetator, niciodata acel gandac nu va ramane fara cercetator [eventual doar il schimba] si de aici se face un apel recursiv la o functie ca sa vedem daca nu putem reatribui gandacul altcuiva...
Ca sa fiu mai explicit:
Cod:
int cauta_gandacel( long x ) {
    lista *p;
...
   for (p = G[x]; p; p=p->n) {
        if ( dr[p->x] == 0 || cauta_gandacel(dr[p->x]) ) {
            dr[p->x] = x;
            return 1;
        }
...    return 0;
}

In mare cam asta e, exista acolo un apel recursiv la cauta_gandacel Smile... dar mie imi da Memory limit exceeded nu Seg fault => iese din cei 64MB pt memorie Surprised

Cod:
    while (T--) {
        nr = 0;
       scanf("%ld %ld %ld", &N, &M, &E);
        for (i=0; i<E; ++i) {
            scanf("%ld %ld", &x, &y);
            add(y,x);
        }
        cuplaj();
        printf("%ld\n", nr);
        remove();
    }

in afara de niste memseturi in while, cam asta e citirea mea ... remove si add sunt procedurile de mai sus... nu vad ce are Sad... doar le dealoc dupa fiecare subtest... inseamna ca intr-un subtest fol mai multa memorie decat pot tine, si nu vad cum pot rezolva asta ... sau ca "delete" in c++ nu prea face ce trebuie ! Sad
Memorat
DITzoneC
Nu mai tace
*****

Karma: 301
Deconectat Deconectat

Mesaje: 962



Vezi Profilul
« Răspunde #12 : Februarie 05, 2007, 22:13:01 »

Cred ca poti sa ai Memory limit exceeded si de la apelul recursiv. Daca procedura care se apeleaza iti intra intr-un ciclu infinit ea va tot pune chestii pe stiva deci la un moment data va depasi limita de memorie. Verifica conditia de oprire a apelului recursiv...
Memorat
sima_cotizo
Nu mai tace
*****

Karma: 219
Deconectat Deconectat

Mesaje: 596



Vezi Profilul
« Răspunde #13 : Februarie 05, 2007, 22:46:44 »

Ciudat, era de la depasirea stivei cred Smile ...
Aveam cateva erori cum ar fi un vector de char in loc de long si o codificare pe biti tocmai ca sa ocup mai putina memorie, dar care era putin gresita [o conditie]... Acum am doar Incorect...  Weightlift mai e de munca!

Multumesc mult de ajutor!

[Later edit] Am dat mai multe teste, inclusiv cele de pe la alte probleme de cuplaj de prin arhiva... si imi da corect Smile Daca are cineva un test mai "tricky" il rog sa il posteze... nu ma prind ce ar putea fi gresit...
« Ultima modificare: Februarie 05, 2007, 23:00:07 de către Sima Mihai Cotizo » Memorat
DITzoneC
Nu mai tace
*****

Karma: 301
Deconectat Deconectat

Mesaje: 962



Vezi Profilul
« Răspunde #14 : Februarie 05, 2007, 23:11:16 »

Cod:
for (i=0; i<E; ++i) {
            scanf("%ld %ld", &x, &y);
            add(y,x);
Nu trebuie sa ai
Cod:
            add(x,y);
?
Memorat
sima_cotizo
Nu mai tace
*****

Karma: 219
Deconectat Deconectat

Mesaje: 596



Vezi Profilul
« Răspunde #15 : Februarie 06, 2007, 10:01:49 »

Mmm... nu Smile adica nu cred ca e vreo diferenta...
In problema zice ca ordinea din fisier e "cercetator - gandac"; eu incerc sa unesc fiecare gandac cu cate un cercetator, deci lista mea de adiacenta este pentru fiecare gandac ce cercetatori poate alege... deci am pus add(y,x). Nu cred ca este vreo diferenta daca incerc sa cuplez maximal gandacii cu cercetatorii sau invers, nu m-am gandit..

Anyway, acum am gasit si alte mici greseli si imi da TLE pana la urma... se pare ca algoritmul asta are complexitate O(N*E)... Sad si cu flux nu cred ca gasesc ceva mai bun.
Memorat
DITzoneC
Nu mai tace
*****

Karma: 301
Deconectat Deconectat

Mesaje: 962



Vezi Profilul
« Răspunde #16 : Februarie 06, 2007, 15:01:49 »

Este o diferenta ( daca M <> N ) din momentu ce ai M gandaci si N cercetatori tu zici ca vrei sa cuplezi cei M gandaci, dar in procedura de eliberare faci forul pana la N...
Memorat
sima_cotizo
Nu mai tace
*****

Karma: 219
Deconectat Deconectat

Mesaje: 596



Vezi Profilul
« Răspunde #17 : Februarie 06, 2007, 17:16:20 »

Da, ai perfecta dreptate... Citisem prost enuntul, la mine N era numarul de gandaci.
Totusi, acum nu primesc WA ci TLE pe linie Sad. Cred ca oricum nu e potrivit algoritmul. Ma straduiesc in continuare!
Memorat
wefgef
Nu mai tace
*****

Karma: 1049
Deconectat Deconectat

Mesaje: 3.008


razboinicu' luminii


Vezi Profilul
« Răspunde #18 : Februarie 06, 2007, 20:16:19 »

Limita de timp e foarte stransa. Ai grija ce algoritm iti alegi, pentru ca nu toate intra in timp.
Memorat

omului i-au fost date instinctele pentru a supravietui, nu pentru a fi sclavul lor.
vanila0406
De-al casei
***

Karma: -174
Deconectat Deconectat

Mesaje: 107


Be wise,be smart,be like me!


Vezi Profilul
« Răspunde #19 : Aprilie 03, 2007, 14:10:47 »

mie imi iese din memorie cu Ford-Fulkerson  Cry
Memorat

Only one thing I know:Death is the best way to a better life.
Dastas
Vorbaret
****

Karma: 11
Deconectat Deconectat

Mesaje: 170



Vezi Profilul
« Răspunde #20 : Octombrie 07, 2007, 20:41:08 »

Ar putea cineva explica ceva mai pe larg ideea care sta la baza algoritmului Hopcroft Karp? In cormen e tratat foarte sumar algoritmul, iar pe net nu am gasit ceva mai bun...

Nu prea inteleg cum determin lanturile alea alternante maximal...
Memorat
fireatmyself
Nu mai tace
*****

Karma: 36
Deconectat Deconectat

Mesaje: 492



Vezi Profilul
« Răspunde #21 : Octombrie 07, 2007, 22:17:46 »

Gasesti un articol pe aceasta tema in sectiunea downloads. Acesta a fost scris de Mugurel Ionut Andreica si prezentat pe 13 mai 2006, la Ploiesti, in cadrul taberei de pregatire a lotului national de informatica.
« Ultima modificare: Octombrie 08, 2007, 14:31:56 de către Bogdan A. Stoica » Memorat

Viata e scurta. Daca nu o putem lungi, macar s-o facem lata.
Dastas
Vorbaret
****

Karma: 11
Deconectat Deconectat

Mesaje: 170



Vezi Profilul
« Răspunde #22 : Octombrie 08, 2007, 13:15:57 »

Am descarcat arhiva cu lotul din 2006 de la Ploiesti si nici macar nu exista un 13 mai... exista un articol 'Hopcroft' in folderul 14 mai dar nu prea are legatura cu cuplajul maximal in graf bipartit...

Sigur e acolo?
Memorat
devilkind
Echipa infoarena
Nu mai tace
*****

Karma: 284
Deconectat Deconectat

Mesaje: 1.240



Vezi Profilul
« Răspunde #23 : Octombrie 08, 2007, 14:25:49 »

varule vezi ca linku tau e prost. Ai pus de 2 ori http://
Memorat
fireatmyself
Nu mai tace
*****

Karma: 36
Deconectat Deconectat

Mesaje: 492



Vezi Profilul
« Răspunde #24 : Octombrie 08, 2007, 14:34:24 »

pentru Tibi: s-a rezolvat linkul  Very Happy

pentru Vlad: imi cer scuze, era lotul de la Suceava din 2007. eu nu am articolul in fata, dar stiu de la Mugurel ca are prezentat si un algoritm destept pentru cuplaj. daca, insa, imi aduc eu aminte prost Aha, si nu este acolo, poate te ajuta informatiile de aici.
« Ultima modificare: Octombrie 08, 2007, 14:37:38 de către Bogdan A. Stoica » Memorat

Viata e scurta. Daca nu o putem lungi, macar s-o facem lata.
Pagini: [1] 2 3   În sus
  Imprimă  
 
Schimbă forumul:  

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