infoarena

infoarena - concursuri, probleme, evaluator, articole => Arhiva de probleme => Subiect creat de: ditzone din Octombrie 15, 2006, 21:35:32



Titlul: 290 Gandaci Java
Scris de: ditzone din Octombrie 15, 2006, 21:35:32
Aici puteţi discuta despre problema Gandaci Java (http://infoarena.ro/problema/java).


Titlul: Raspuns: 290 Gandaci Java
Scris de: Rus Cristian din Octombrie 17, 2006, 18:31:05
un cercetator poate prinde mai multi gandaci?


Titlul: Raspuns: 290 Gandaci Java
Scris de: Marius Stroe din Octombrie 17, 2006, 18:33:18
un cercetator poate prinde mai multi gandaci?

Nu.


Titlul: Raspuns: 290 Gandaci Java
Scris de: David si Goliat din 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  :shock:
 Care-i smenu , pana la urma ??


Titlul: Raspuns: 290 Gandaci Java
Scris de: Adrian Vladu din Noiembrie 06, 2006, 17:33:27
Incearca sa o implementezi si vei vedea  :mrgreen:


Titlul: Raspuns: 290 Gandaci Java
Scris de: David si Goliat din 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.
   


Titlul: Raspuns: 290 Gandaci Java
Scris de: Marius Stroe din 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!  :P


Titlul: Raspuns: 290 Gandaci Java
Scris de: Savin Tiberiu din Noiembrie 06, 2006, 19:08:49
cred ca vrei sa zici n^2/2 nu n^1  :thumbup:, 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.


Titlul: Raspuns: 290 Gandaci Java
Scris de: Bogdan-Cristian Tataroiu din 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 :)

devilkind: n^(1/2)


Titlul: Raspuns: 290 Gandaci Java
Scris de: Sima Cotizo din 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...  :o

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... :(

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; } ...


Titlul: Raspuns: 290 Gandaci Java
Scris de: Adrian Diaconu din Februarie 05, 2007, 20:31:30
Par in regula functiile alea, esti sigur ca nu e de la altceva ... ?


Titlul: Raspuns: 290 Gandaci Java
Scris de: Sima Cotizo din 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 :)... dar mie imi da Memory limit exceeded nu Seg fault => iese din cei 64MB pt memorie :o

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 :(... 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 ! :(


Titlul: Raspuns: 290 Gandaci Java
Scris de: Adrian Diaconu din 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...


Titlul: Raspuns: 290 Gandaci Java
Scris de: Sima Cotizo din Februarie 05, 2007, 22:46:44
Ciudat, era de la depasirea stivei cred :) ...
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 :) Daca are cineva un test mai "tricky" il rog sa il posteze... nu ma prind ce ar putea fi gresit...


Titlul: Raspuns: 290 Gandaci Java
Scris de: Adrian Diaconu din 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);
?


Titlul: Raspuns: 290 Gandaci Java
Scris de: Sima Cotizo din Februarie 06, 2007, 10:01:49
Mmm... nu :) 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)... :( si cu flux nu cred ca gasesc ceva mai bun.


Titlul: Raspuns: 290 Gandaci Java
Scris de: Adrian Diaconu din 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...


Titlul: Raspuns: 290 Gandaci Java
Scris de: Sima Cotizo din 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 :(. Cred ca oricum nu e potrivit algoritmul. Ma straduiesc in continuare!


Titlul: Raspuns: 290 Gandaci Java
Scris de: Andrei Grigorean din 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.


Titlul: Răspuns: 290 Gandaci Java
Scris de: Ionescu Victor din Aprilie 03, 2007, 14:10:47
mie imi iese din memorie cu Ford-Fulkerson  :'(


Titlul: Răspuns: 290 Gandaci Java
Scris de: Ionescu Vlad din 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...


Titlul: Răspuns: 290 Gandaci Java
Scris de: Bogdan-Alexandru Stoica din Octombrie 07, 2007, 22:17:46
Gasesti un articol pe aceasta tema in sectiunea downloads (http://infoarena.ro/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.


Titlul: Răspuns: 290 Gandaci Java
Scris de: Ionescu Vlad din 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?


Titlul: Răspuns: 290 Gandaci Java
Scris de: Savin Tiberiu din Octombrie 08, 2007, 14:25:49
varule vezi ca linku tau e prost. Ai pus de 2 ori http://


Titlul: Răspuns: 290 Gandaci Java
Scris de: Bogdan-Alexandru Stoica din Octombrie 08, 2007, 14:34:24
pentru Tibi: s-a rezolvat linkul  :D

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 (http://books.google.com/books?id=ZPDqRTRxITsC&pg=PA260&ots=OMtfIEK32x&dq=Algorithm+for+Maximum+Matchings+in+Bipartite+Graphs&sig=k4WYQAsLEaRxrhGXPNaXpkK8qME#PPA260,M1).


Titlul: Răspuns: 290 Gandaci Java
Scris de: NoName din Martie 23, 2011, 16:31:50
Am bagat initial cuplaj maxim... tle + incorect. Am schimbat pe Hopcroft Karp, iau doar incorect. Fac cuplajul si stergerea vectorului. Omit ceva? Cei care au luat 0 si dupa 100 ce-ati facut sa scapati de incorect ?

Thx.


Titlul: Răspuns: 290 Gandaci Java
Scris de: Simoiu Robert din Octombrie 04, 2011, 17:20:27
AR trebuie reevaluat si aici limita, sursa asta http://infoarena.ro/job_detail/613740 lua 100 inainte.


Titlul: Răspuns: 290 Gandaci Java
Scris de: Gavrila Vlad din Octombrie 04, 2011, 19:00:20
@Robert: Asta e a 3-a problema deja (celelalte 2: intersect, cuvinte2) la care zici ca limita e prea mica, desi tu nu luasesi 100 nici inainte de recalculare. :-' Rog adminii sa verifice daca cei care semnaleaza limite eronate rezolvasera corect problema inainte.


Titlul: Răspuns: 290 Gandaci Java
Scris de: Simoiu Robert din Octombrie 04, 2011, 19:17:28
Nu am luat eu, a luat prietenul meu si complexitatea e cam aceeasi ...
[PS] : Oricum trebuie recalculati multi timpi, poate ca un criteriu ar fi cea mai rea sursa care a luat 100 (in sens de timp) sa fie reevaluata (pt. fiecare pb) si daca ea nu ia 100 puncte, sa faca limita in asa fel incat sa ia 100.


Titlul: Răspuns: 290 Gandaci Java
Scris de: Paul-Dan Baltescu din Octombrie 05, 2011, 02:07:27
Nu mi se pare bun criteriul. Trebuie sa ia 100 de puncte sursele care merita.


Titlul: Răspuns: 290 Gandaci Java
Scris de: Simoiu Robert din Octombrie 05, 2011, 07:35:23
Am facut un cuplaj maxim care lua 100 in arhiva educationala .... ce altceva sa mai fac ... asa e si solutia oficiala ...


Titlul: Răspuns: 290 Gandaci Java
Scris de: Vasilut Lucian din Iunie 29, 2012, 12:20:40
Buna Ziua.am facut la problema asta un Hopcroft Karp si nu iau decat 0 pct (incorect + 5 TLE) :'(vreo sugestie ceva.
Multumesc anticipat. :D


Titlul: Răspuns: 290 Gandaci Java
Scris de: Vasilut Lucian din Iulie 05, 2012, 22:01:00
 :'( :'( :'(am verificat de 100 ori sursa si nu vad o greseala.rog un admin sa se uite peste sursa sa vada ce am gresit ](*,) ](*,) ](*,)
Multumesc anticipat!
Cod:

#include<fstream>
#include<cstring>
#include<vector>

#define NN 10001
#define pb push_back

using namespace std;
ofstream out("java.out");

int  n,m,e,t,uz[NN],dr[NN],st[NN];
vector<int>G[NN];
typedef vector<int>:: iterator IT;

void read();
int pairup(int start);
int facuplaj();

int main()
{
read();
return 0;


}

int pairup(int start)
{
if(uz[start])
return 0;
uz[start]=1;
for(IT I=G[start].begin();I!=G[start].end();++I)
if(!st[*I] || pairup(st[*I]) )
{
st[*I]=start;
dr[start]=*I;
return 1;
}
return 0;
}

int facuplaj()
{
int ok=1;
int cuplaj=0;
while(ok)
{
ok=0;
memset(uz,0,sizeof(uz));
for(int i=1;i<=n;i++)
if(!dr[i] && pairup(i))
{
++cuplaj;
ok=1;
}
}
return cuplaj;
}


void read()
{
ifstream in("java.in");
in>>t;
while(t)

{

in>>m>>n>>e;
for(int x,y,i=1;i<=e;i++)
{
in>>x>>y;
G[x].pb(y);

}

facuplaj();
int nrc=0;
for(int i=1;i<=n;i++)
if(dr[i])
++nrc;
out<<nrc<<'\n';
//out<<i<<" "<<dr[i]<<" "<<'\n';

t--;
}
}





Titlul: Răspuns: 290 Gandaci Java
Scris de: Mihai Calancea din Iulie 05, 2012, 22:12:25
Cred ca ai incurcat m-ul cu n-ul la un moment dat. Mi se pare ca for-urile din cuplaj trebuie sa se duca pana la m.


Titlul: Răspuns: 290 Gandaci Java
Scris de: Vasilut Lucian din Iulie 06, 2012, 06:49:12
Cred ca ai incurcat m-ul cu n-ul la un moment dat. Mi se pare ca for-urile din cuplaj trebuie sa se duca pana la m.
am modificat ,dar tot 0 pct iau :'(  ](*,)


Titlul: Răspuns: 290 Gandaci Java
Scris de: Adrian Budau din Iulie 06, 2012, 07:58:26
Nu te supara pe ce-ti zic acum, dar daca te-ai mai uitat pe forum ai vazut ca nu suntem tocmai pro acestei strategii "spuneti-mi unde am gresit". In general daca iti spunem noi ce ai gresit nu castigi prea mult.
Cel mai bine iti faci un backtracking, usor, scurt, si un generator de teste. Daca nu stii cum iti dau un exemplu. Cu ocazia asta inveti ceva pentru olimpiada.


Titlul: Răspuns: 290 Gandaci Java
Scris de: Vasilut Lucian din Iulie 17, 2012, 21:26:52
 :D am reusit sa iau 60 pct:AM  8 TLE.folosesc Hopcroft Karp .ce as mai putea face sa reduc timpul? :-k

Multumesc Anticipat!!! :)


Titlul: Răspuns: 290 Gandaci Java
Scris de: George Marcus din Iulie 17, 2012, 21:35:17
Desparte acel for din functia pairup() astfel incat prima data verifici daca il poti cupla simplu cu un vecin si a doua oara daca nu cumva poti recupla nodurile si apoi sa-l cuplezi cu vecinul. Deci sa faci doua for-uri separate pentru fiecare conditie.


Titlul: Răspuns: 290 Gandaci Java
Scris de: Vasilut Lucian din Iulie 17, 2012, 21:39:20
Desparte acel for din functia pairup() astfel incat prima data verifici daca il poti cupla simplu cu un vecin si a doua oara daca nu cumva poti recupla nodurile si apoi sa-l cuplezi cu vecinul. Deci sa faci doua for-uri separate pentru fiecare conditie.
am incercat dar tot 60 iau :'(


Titlul: Răspuns: 290 Gandaci Java
Scris de: George Marcus din Iulie 17, 2012, 22:04:58
N-ai facut ce am zis eu.


Titlul: Răspuns: 290 Gandaci Java
Scris de: Vasilut Lucian din Iulie 17, 2012, 22:06:06
N-ai facut ce am zis eu.

Cod:
int pairup(int start)
{
if(uz[start])
return 0;
uz[start]=1;
for(IT I=G[start].begin();I!=G[start].end();++I)
if(!dr[*I]  )
{
dr[*I]=start;
st[start]=*I;

return 1;
}
for(IT I=G[start].begin();I!=G[start].end();++I)
if( pairup(dr[*I] ) )
{
dr[*I]=start;
st[start]=*I;
return 1;
}

return 0;
}


nu asa?


Titlul: Răspuns: 290 Gandaci Java
Scris de: George Marcus din Iulie 17, 2012, 22:09:39
Ba da. Scuze, n-am vazut in niciuna din sursele tale asta. Probabil va trebui si sa parsezi citirea pentru 100.


Titlul: Răspuns: 290 Gandaci Java
Scris de: Vasilut Lucian din Iulie 17, 2012, 22:34:22
 :yahoo: :yahoo: :yahoo: am luat 100. de 2 ore tot incercam sa vad dc iau TLE ,dau eu trimiteam alta sursa ](*,).


Titlul: Răspuns: 290 Gandaci Java
Scris de: Stratulat Alexandru din Martie 28, 2013, 16:28:13
Algoritmul meu este de a obtine un cuplaj maxim intre cercetatori(multime 1-m) si gandaci. Iau WA pe toate testele. In exemplu imi da bine. Am optimizat sa nu iau TLE sau MME. Imi bat capul de ore intregi si nu vad greseala. Ce am putut gresi aici ?
<code>
 #include <cstdio>
#include <vector>
#include <cstring>
#define NMAX 10010
using namespace std;

vector < int > Graf[NMAX];
int vizitat[NMAX];
int dr[NMAX];
int g[NMAX];
int st[NMAX];
int n,m,e,nr;
int T;
bool ok;

bool Hopcroft_Karp(int nod){

   if(vizitat[nod]) return 0;
   vizitat[nod] = 1;
    for(vector < int >::iterator it = Graf[nod].begin();it!=Graf[nod].end();++it)
        if(!dr[*it]){
            dr[*it] = nod;
            st[nod] = *it;
            return 1;
        }
    for(vector < int >::iterator it = Graf[nod].begin();it!=Graf[nod].end();++it)
        if( Hopcroft_Karp(dr[*it])){
            dr[*it] = nod;
            st[nod] = *it;
            return 1;
        }

return 0;
}

int main(){

freopen("java.in","r",stdin);
freopen("java.out","w",stdout);
int x,y;

    scanf("%d",&T);
    while(T){
          nr=0;
        scanf("%d%d%d",&m,&n,&e);
    while(e){

        scanf("%d%d",&x,&y);
        Graf
  • .push_back(y);
       g
  • = 1;

    --e;
    }

    ok=1;
    nr=0;
    while(ok){

        ok = 0;
        for(register int i=1;i<=m;++i)
        if(!st)
        if(Hopcroft_Karp(i)) ok=1;
        memset(vizitat,0,sizeof(vizitat));
    }
        for(register int i=1;i<=n;++i)
            if(dr) ++nr;
            printf("%d\n",nr);

     for(register int i=1;i<=m;++i)
        if(g)
        Graf.assign(Graf.size()+1,0);
        memset(g,0,sizeof(g));
    --T;

    }
return 0;
}
</code>


Titlul: Răspuns: 290 Gandaci Java
Scris de: Pirtoaca George Sebastian din Martie 28, 2013, 16:33:42
Incearca sa resetezi toti vectorii folositi, inainte de a incepe un nou test. Succes!


Titlul: Răspuns: 290 Gandaci Java
Scris de: Stratulat Alexandru din Martie 28, 2013, 16:48:11
Intr-adevar uitasem sa setez la 0 toti vectorii. Insa am facut aceasta modificare si iau 10 pcte. Iau si WA si TLE  pe unele teste.
Uite acum arata acum programul:

Cod:
#include <cstdio>
#include <vector>
#include <cstring>
#define NMAX 10010
using namespace std;

vector < int > Graf[NMAX];
int vizitat[NMAX];
int dr[NMAX];
int g[NMAX];
int st[NMAX];
int n,m,e,nr;
int T;
bool ok;

bool Hopcroft_Karp(int nod){

   if(vizitat[nod]) return 0;
   vizitat[nod] = 1;
    for(vector < int >::iterator it = Graf[nod].begin();it!=Graf[nod].end();++it)
        if(!dr[*it]){
            dr[*it] = nod;
            st[nod] = *it;
            return 1;
        }
    for(vector < int >::iterator it = Graf[nod].begin();it!=Graf[nod].end();++it)
        if( Hopcroft_Karp(dr[*it])){
            dr[*it] = nod;
            st[nod] = *it;
            return 1;
        }

return 0;
}

int main(){

freopen("java.in","r",stdin);
freopen("java.out","w",stdout);
int x,y;

    scanf("%d",&T);
    while(T){
          nr=0;
        scanf("%d%d%d",&m,&n,&e);
    while(e){

        scanf("%d%d",&x,&y);
        Graf[x].push_back(y);
        g[x] = 1;

    --e;
    }

    ok=1;
    nr=0;
    while(ok){

        ok = 0;
        for(register int i=1;i<=m;++i)
        if(!st[i])
        if(Hopcroft_Karp(i)) ok=1;
        memset(vizitat,0,sizeof(vizitat));
    }
        for(register int i=1;i<=n;++i)
            if(dr[i]) ++nr;
            printf("%d\n",nr);

     for(register int i=1;i<=m;++i)
        if(g[i])
        Graf[i].assign(Graf[i].size()+1,0);
        memset(g,0,sizeof(g));
        memset(dr,0,sizeof(dr));
        memset(st,0,sizeof(st));
        memset(vizitat,0,sizeof(vizitat));
    --T;

    }
return 0;
}

Editat de moderator: Foloseste tag-ul [ code ] [/ code ] cand postezi cod!


Titlul: Răspuns: 290 Gandaci Java
Scris de: Pirtoaca George Sebastian din Martie 28, 2013, 16:51:19
Inlocuieste asta :
Cod:
for(register int i=1;i<=m;++i)
        if(g)  Graf.assign(Graf.size()+1,0);
cu
Cod:
for(int i=1;i<=m;i++)
        Graf[i].clear();


Titlul: Răspuns: 290 Gandaci Java
Scris de: Stratulat Alexandru din Martie 28, 2013, 17:00:11
Wow am luat 90. Inca iau TLE pe 2 teste.


Titlul: Răspuns: 290 Gandaci Java
Scris de: Pirtoaca George Sebastian din Martie 28, 2013, 17:00:57
Pentru 100 trebuie sa parsezi citirea.  :)


Titlul: Răspuns: 290 Gandaci Java
Scris de: Stratulat Alexandru din Martie 28, 2013, 17:05:38
Da ma gandeam ca trebuie sa parsez si am luat 100. Mersi mult pentru cele 2 sfaturi cruciale. Mai ales ala cu Graf.clear am sa-l retin toata viata  :banana:


Titlul: Răspuns: 290 Gandaci Java
Scris de: Mihai Ionut Enache din August 24, 2013, 23:24:55
De ce dintre urmatoarele 2 functii de cuplare
Cod:
inline bool pair_up(int x) {
    if(used[x])
        return 0;
    used[x] = 1;
    for(size_t i = 0; i < v[x].size(); ++i) {
        int y = v[x][i];
        if(!R[y]) {
            L[x] = y;
            R[y] = x;
            return 1;
        }
    }
    for(size_t i = 0; i < v[x].size(); ++i) {
        int y = v[x][i];
        if(pair_up(R[y])) {
            L[x] = y;
            R[y] = x;
            return 1;
        }
    }
    return 0;
}
si
Cod:
inline bool pair_up(int x) {
    if(used[x])
        return 0;
    used[x] = 1;
    for(size_t i = 0; i < v[x].size(); ++i) {
        int y = v[x][i];
        if(!R[y] || pair_up(R[y])) {
            L[x] = y;
            R[y] = x;
            return 1;
        }
    }
    return 0;
}

prima este mai rapida?
Cu alte cuvinte, de ce este mai rapid ca intai sa cuplez nodul x cu un nod catre care am muchie si nu este cuplat, iar abia apoi sa incerc sa-l cuplez cu un nod catre care am muchie si pe care-l decuplez de nodul cu care acesta era cuplat?


Titlul: Răspuns: 290 Gandaci Java
Scris de: Adrian Budau din August 24, 2013, 23:59:54
Prima implementare este defapt algoritmul Hopcroft-Karp (complexitatea O(M sqrt(N)), a doua are complexitate mai mare dar in general se comporta cam la fel, tocmai din acest motiv lumea foloseste de multe ori a doua abordare. Nu stiu exact sa-ti zic ce complexitate are a doua abordare.