infoarena

infoarena - concursuri, probleme, evaluator, articole => Arhiva educationala => Subiect creat de: Paul-Dan Baltescu din Ianuarie 02, 2009, 15:37:08



Titlul: 034 Ciclu Eulerian
Scris de: Paul-Dan Baltescu din Ianuarie 02, 2009, 15:37:08
Aici puteti discuta despre problema Ciclu eulerian (http://infoarena.ro/problema/ciclueuler) din Arhiva educationala (http://infoarena.ro/arhiva-educationala).


Titlul: Răspuns: 034 Ciclu Eulerian
Scris de: Andrei-Bogdan Antonescu din Ianuarie 16, 2009, 17:29:32
Prima din figurile alea nu cred ca are vreun ciclu eulerian ca sunt 4 noduri cu grad impar si unul cu grad par :-k
 (http://infoarena.ro/problema/ciclueuler?action-download&file=euler01.png&safe_only=true)


Titlul: Răspuns: 034 Ciclu Eulerian
Scris de: gaboru corupt din Ianuarie 19, 2009, 22:58:37
in exemplul problemei, avem muchie de la 2 la 2? defapt ramanem pe nodul 2 ? sau nu am inteles eu bine.


Titlul: Răspuns: 034 Ciclu Eulerian
Scris de: Andrei Grigorean din Ianuarie 20, 2009, 00:26:29
Da, grafurile pot contine muchii multiple intre 2 noduri sau self-loops (http://en.wikipedia.org/wiki/Loop_(graph_theory)).


Titlul: Răspuns: 034 Ciclu Eulerian
Scris de: dragus marius din Februarie 20, 2009, 14:43:39
Ar mai fi inca o metoda usoara si demna de mentionat care are in componenta un singur dfs. O astfel de solutie se poate vedea aici: http://infoarena.ro/job_detail/263481. Aceasta ia doar 50 de puncte din cazua ca foloseste un dfs(intrece marimea stivei din cate observ) dar e usor de inteles ce face si usor de implementat. Practic ceea ce face sursa mea e: fac un dfs prin tot graful si am un vector de vizitat pe muchii(nu pe noduri), In data ce nu mai pot merge nicaieri tiparesc nodul.

P.S. Scuza-ti implementarea urata , dar e facuta in borland(vine oji.....).


Titlul: Răspuns: 034 Ciclu Eulerian
Scris de: Lucian Boca din Februarie 21, 2009, 00:23:33
fac un dfs prin tot graful si am un vector de vizitat pe muchii(nu pe noduri), In data ce nu mai pot merge nicaieri tiparesc nodul.

Algoritmul este practic acelasi: construiesc un ciclu si ma intorc pe el, intercaland toate ciclurile suplimentare. Implementarea este putin diferita (marcajele pe muchii) si merita mentionata intr-adevar ca si alternativa; ar fi ideal insa daca ai implementa si o varianta nerecursiva folosind aceeasi idee, pentru a avea o sursa de 100p, care se poate incadra in articolul de solutii. ;)



Titlul: Răspuns: 034 Ciclu Eulerian
Scris de: Cosmin-Mihai Tutunaru din Februarie 21, 2009, 12:11:46
Am implementat eu un dfs nerecursiv pt problema asta...
http://infoarena.ro/job_detail/264061
Insa din pacate nu intra in timp pe testele 8 si 10 :(

L.E.: am facut o mica modificare si am luat suta  :yahoo:


Titlul: Răspuns: 034 Ciclu Eulerian
Scris de: radu ioana din Martie 07, 2009, 12:48:43
Daca exista un ciclu eulerian pt o parte din noduri, iar restu` nodurilor sunt izolate, se afiseaza ciclu` sau -1?  :?


Titlul: Răspuns: 034 Ciclu Eulerian
Scris de: Andrei-Bogdan Antonescu din Martie 07, 2009, 12:53:27
-1 Ciclul trebuie sa fie pentru toate nodurile.


Titlul: Răspuns: 034 Ciclu Eulerian
Scris de: Paul-Dan Baltescu din Martie 07, 2009, 14:58:25
-1 Ciclul trebuie sa fie pentru toate nodurile.

Nu. Ciclul trebuie sa traverseze toate muchiile o singura data si nu are nici o restrictie privind nodurile. Daca exista noduri izolate, acestea nu intra in calcul.


Titlul: Răspuns: 034 Ciclu Eulerian
Scris de: Andrei Grigorean din Martie 07, 2009, 15:50:37
Eu cred ca enuntul problemei ar trebui revizuit.

Un graf se numeste eulerian daca si numai daca este conex si gradul fiecarei nod este par.


Titlul: Răspuns: 034 Ciclu Eulerian
Scris de: Lucian Boca din Martie 08, 2009, 01:20:04
Eu cred ca enuntul problemei ar trebui revizuit.

Un graf se numeste eulerian daca si numai daca este conex si gradul fiecarei nod este par.


Se poate discuta mult pe marginea definitiei; fiecare autor al unei lucrari de teoria grafurilor are particularitatile sale in definitii sau notatii. In cazul de fata, imi pare irelevanta orice obiectie, existand o corespondenta biunivoca intre multimea grafurilor care admit un ciclu eulerian si multimea grafurilor conexe ale caror noduri au toate gradele pare (este una dintre teoremele lui Euler).

Din considerente practice, mi se pare ca a defini grafurile euleriene ca fiind acele grafuri cu proprietatea P1, si a demonstra apoi ca ele au (necesar si suficient) proprietatea P2, este acelasi lucru cu a interschimba P1 si P2 in fraza anterioara. Din considerente teoretice, diferenta aceasta poate deveni importanta, insa, asa cum am spus, lucrarile de specialitate jongleaza prea mult cu termenii pentru a putea avea pretentia unei singure notatii corecte; in final, ramane doar o problema de terminologie.



Titlul: Răspuns: 034 Ciclu Eulerian
Scris de: razyelx din Martie 11, 2009, 20:20:42
imi explicati si mie va rog "La fiecare pas in construirea ciclului, vom alege intotdeauna muchiile de intoarcere inaintea muchiilor de arbore." . Muchiile de intoarcere is alea care formeaza ciclu? Si alea de arbore care nu formeaza? De unde imi pot da seama care muchii is care? Explicatie e putin succinta.
 


Titlul: Răspuns: 034 Ciclu Eulerian
Scris de: Florian Marcu din Martie 11, 2009, 21:12:28
Acolo se refera la arborele DFS. Atunci cand faci parcurgerea normala DFS(), se creaza de fapt un arbore. Sa luam algoritmul concret:
Cod:
void dfs(int x)
 {
    viz[x] = 1;
    pt fiecare vecin a lui x
      {
          if(viz[vecin] == 0) dfs(vecin); // asta este muchie de arbore
          else ; // => viz[vecin]=1 => muchia (x, vecin) este muchie de intoarcere si inchide un ciclu
       }
  }
Ia-ti un graf pe hartie si deseneaza-ti nodurile si muchiile exact in ordinea parcurgerii DF, si o sa intelegi cum sta treaba. Succes!  :)


Titlul: Răspuns: 034 Ciclu Eulerian
Scris de: Otilia Stretcu din Aprilie 03, 2009, 13:20:48
Eu am rezolvat problema fara sa utilizez STL, alocand cu realloc , dar obtin SIGSEGV pe 3 teste.  Nu inteleg de ce, pentru ca am folosit aceeasi metoda ca si in rezolvarea oficiala, deci ar trebui sa foloseasca la fel de multa memorie.
Puteti sa va uitati si pe sursa mea, va rog: http://infoarena.ro/job_detail/295583?action=view-source
Multumesc!  :)


Titlul: Răspuns: 034 Ciclu Eulerian
Scris de: Andrei-Bogdan Antonescu din Aprilie 03, 2009, 18:18:19
Citat
Inserează citat
Eu am rezolvat problema fara sa utilizez STL, alocand cu realloc , dar obtin SIGSEGV pe 3 teste.  Nu inteleg de ce, pentru ca am folosit aceeasi metoda ca si in rezolvarea oficiala, deci ar trebui sa foloseasca la fel de multa memorie.
Puteti sa va uitati si pe sursa mea, va rog: http://infoarena.ro/job_detail/295583?action=view-source
Multumesc!  Smile

Poti sa iei testele de la atasamente,  le rulezi la tine si vezi exact unde crapa.  :)


Titlul: Răspuns: 034 Ciclu Eulerian
Scris de: Procopliuc Adrian din Mai 07, 2009, 21:50:27
De ce-mi da killed by signal daca folosesc liste liniare?  :-k
Pe windows la primul test de la atasamente imi merge bine,iar la evaluare imi da killed by signal :sad:


Titlul: Răspuns: 034 Ciclu Eulerian
Scris de: Florian Marcu din Mai 07, 2009, 21:58:43
Citat
scanf ("%i%i",&x,&y); 
Incearca sa citesti cu " %d ". Poate de aici e. Daca nu, fii atent cum faci legaturile alea. E destul de dubioasa sursa ta. Nu vad unde simulezi stiva, si mi se pare ciudat ca aloci noduri noi (apoi le stergi) de fiecare data cand apelezi ciclu() . Si un sfat prietenesc: ordoneaza-ti putin sursele (ca aspect), ca asa nu intelege nimeni nimic.  :) Spor!


Titlul: Răspuns: 034 Ciclu Eulerian
Scris de: Codrea Marcel din Mai 07, 2009, 22:04:20
Linux are o gestiune impecabilă a memoriei, spre deosebire de Windows unde în cazul în care scăparea nu este foarte mare, execuţia o să pară în regulă şi o să întoarcă 0. De aceea nu apare nimic suspect când rulezi de acasă. Primeşti "Killed by signal" cel mai probabil din cauza unor greşeli la operaţiile cu liste, accesezi ceva nealocat în prealabil. Pentru a spori lizibilitatea surselor (aşa cum ai structurat-o, sursa e indescifrabilă pentru oricine care nu a scris-o, adică pentru noi toţi), poţi folosi CodeBlocks  (http://www.codeblocks.org/downloads)care oferă posibilitatea indentării lor urmând un anumit tipar printr-un singur click.


Titlul: Răspuns: 034 Ciclu Eulerian
Scris de: Procopliuc Adrian din Mai 08, 2009, 18:31:39
cred ca  sursa http://infoarena.ro/job_detail/313322?action=view-source  este structurata putin mai bine


Titlul: Răspuns: 034 Ciclu Eulerian
Scris de: Savin Tiberiu din Mai 10, 2009, 13:45:27
Te inseli :). Uita-te si tu la sursele celorlalti concurenti si vezi cum au implementat :).


Titlul: Răspuns: 034 Ciclu Eulerian
Scris de: Procopliuc Adrian din Mai 10, 2009, 14:06:42
care-i greseala? :-k
Pe windows imi merge bine ](*,)


Titlul: Răspuns: 034 Ciclu Eulerian
Scris de: George Popoiu din Februarie 05, 2010, 13:59:16
Iau 80 pct, iar pe testele 2 si 4 iau "fisier de iesire corupt!" si nu inteleg de la ce ar putea fi.

Stie cineva?  :-k


Titlul: Răspuns: 034 Ciclu Eulerian
Scris de: Paul-Dan Baltescu din Februarie 06, 2010, 07:05:00
M-am uitat in evaluator si acest mesaj apare cand ce afisezi nu respecta formatul cerut. Ori afisezi prea multe/prea putine noduri ori afisezi varfuri care nu apartin intervalului [1, N] (in situatia in care exista solutie).


Titlul: Răspuns: 034 Ciclu Eulerian
Scris de: Dragos din Februarie 10, 2010, 17:29:35
Salut! Am si eu o intrebare.
Ciclul eulerian nu iese din prima decat in cazul in care noduri critice?
              (cum e in exemplul de mai sus nodul 3 )
a iesit din prima= apelam doar o data functia euler si avem raspunsul


Titlul: Răspuns: 034 Ciclu Eulerian
Scris de: Paul-Dan Baltescu din Februarie 10, 2010, 19:13:27
Nu inteleg ce vrei sa spui. Poti sa reformulezi intrebarea?


Titlul: Răspuns: 034 Ciclu Eulerian
Scris de: Dragos din Februarie 10, 2010, 20:04:58
Nu inteleg ce vrei sa spui. Poti sa reformulezi intrebarea?

Ok! Ma refer la ultima varianta de rezolvare, cea cu ciclurile disjuncte.
Daca o sa te uiti in sursa lui Lucian vei observa ca dupa ce determina daca graful este eulerian e face un do-while in care cauta  ciclurile disjuncte din graf.
Un ciclu il gaseste dupa ce apeleaza o singura data functia euler();
Si eu ma intrebam daca avem nevoie de mai mult de un apel doar atunci cand avem deaface cu noduri critice?(adica asta e intrebarea:) )
Acest lucru se observa si in problema de mai sus pentru ca nodul 3 e nod critic.


Titlul: Răspuns: 034 Ciclu Eulerian
Scris de: Petru Trimbitas din Iunie 16, 2010, 19:04:27
Are cineva o sursa comentata fara stl? Am incercat sa implementez dar gresesc la stergere.  :fool:
edit: nu am reusit sa termin deoarece greser\sc stergerile. Din lene am renuntat sa rezolv pb asta fara stl.


Titlul: Răspuns: 034 Ciclu Eulerian
Scris de: SAlexandru din Iunie 16, 2010, 19:31:49
Are cineva o sursa comentata fara stl? Am incercat sa implementez dar gresesc la stergere.  :fool:
Mai simplu posteaza, sau trimite sursa ta si noi corectam :)


Titlul: Răspuns: 034 Ciclu Eulerian
Scris de: MciprianM din August 09, 2010, 19:45:26
A implementat cineva algoritmul lui Fleury? Nu prea stiu cum sa determin daca o muchie e punte(sau critica...) dupa update in mod eficient.
L.E.: Niciun test nu contine un graf care nu este conex?


Titlul: Răspuns: 034 Ciclu Eulerian
Scris de: livica din Decembrie 06, 2010, 20:26:47
"Pentru determinarea lantului, vom adaugata fictiv o muchie intre aceste doua noduri, dupa care vom aplica algoritmul de determinare a unui ciclu Eulerian. Eventual, acest ciclu determinat va fi 'rupt' in locul in care apare muchia adaugata si tiparit in ordinea corecta."

Eu am implementat algoritmul recursiv si totul merge perfect. Nu mai trebuie sa adaugi nicio muchie fictiva. Trebuie doar sa apelezi euler(nod de grad impar). Si merge. NU inteleg de ce ati scris chestia asta cu muchia. Va rog raspundeti-mi ca sa nu mor prost.

[email protected]


Titlul: Răspuns: 034 Ciclu Eulerian
Scris de: Mihai Calancea din Decembrie 06, 2010, 21:31:54
Chestia asta cu muchia a fost scrisa ca sa-ti arate intr-un mod elegant ca e practic aceeasi problema cu cea a ciclului eulerian.
Cuvantul 'fictiv' ar fi trebuit sa-ti dea un hint in sensul asta. Adopta un ton mai calm si mai cooperant, te rog.


Titlul: Răspuns: 034 Ciclu Eulerian
Scris de: Tudorache Marius din Ianuarie 15, 2011, 15:59:56
Solutia prezentata ca fiind optima e O(M*N), eliminarea unei muchii se face in O(N) deci nu intra in timp pe niste teste bune.


Titlul: Răspuns: 034 Ciclu Eulerian
Scris de: Mihai Calancea din Ianuarie 15, 2011, 23:20:15
De ce zici ca eliminarea unei muchii se face in O(N)?


Titlul: Răspuns: 034 Ciclu Eulerian
Scris de: Tudorache Marius din Ianuarie 16, 2011, 15:54:17
Cod:
void sterge( int v, int w ) 
{
  deg[v]--, deg[w]--;
  G[v].pop_front();
  TR( G[w], it )
   if( *it == v )
   {
       G[w].erase( it );
       break;
   }
}

Mi se pare destul de O(n)  :). Un varf poate sa aiba N vecini si ala pe care il stergi sa fie ultimul in lista.


Titlul: Răspuns: 034 Ciclu Eulerian
Scris de: Tudorache Marius din Ianuarie 16, 2011, 16:00:36
Testele sunt slabe si nu diferentiaza o astfel de solutie de una optima.


Titlul: Răspuns: 034 Ciclu Eulerian
Scris de: Mihai Calancea din Ianuarie 16, 2011, 17:35:05
Nu sunt testele slabe. Presupunand ca muchiile sunt distribuite relativ uniform, pe testele maxime marimea listelor de adiacenta e mult mai mica decat n.  Ai nevoie de un graf cu densitate mult mai mare ca sa busesti stergerea aia, ori e cam imposibil sa dai ca input un graf dens cu 100 000 de noduri.

Stergerea o poti face mai bine. Stergi muchia doar din v si o marchezi pentru eliminare intr-un vector. Astfel o vei sterge din lista lui w de-abia cand treci pe-acolo si o intalnesti, nefiind nevoie sa o mai cauti pe loc.

Deci e O(n + m).


Titlul: Răspuns: 034 Ciclu Eulerian
Scris de: Tudorache Marius din Ianuarie 16, 2011, 19:26:06
Ce te face sa presupui ca muchiile sunt distribuite uniform? Vorbim de analiza in cazul cel mai defavorabil nu in cazul mediu. Considera graful urmator: N noduri (N par) 1 si 2 noduri speciale 1 are muchie catre toate cele N-2 noduri ramase, 2 la fel (in total 2*(N-2) muchii deci graf deloc dens) cati vecini are 1 si cat dureaza sa elimini un element din lista lui de vecini?


Titlul: Răspuns: 034 Ciclu Eulerian
Scris de: Florian Marcu din Ianuarie 16, 2011, 19:36:04
Poti sa tii un hash in care sa bagi muchiile sterse => stergere muchie O(1). Si probabil ca mai sunt si alte solutii. Dar nu pe stergerea muchiei se pune accentul la problema aceasta. E arhiva educationala, deci nu e nevoie de teste super puternice.


Titlul: Răspuns: 034 Ciclu Eulerian
Scris de: Tudorache Marius din Ianuarie 16, 2011, 20:10:31
Stiu ca se poate, si cum se poate. Problema e ca fiind arhiva educationala omu vine si invata problema se uita si peste sursa oficiala, face stergerea in O(N) ia 100 la problema si zice "da dom'le stiu sa rezolv problema". Apoi se duce la concurs implementeaza aceeasi solutie si ia 50 de puncte pe teste mai bune si se intreaba "de ce?". Asta e singurul lucru pe care vroiam sa-l punctez.


Titlul: Răspuns: 034 Ciclu Eulerian
Scris de: Usurelu Catalin din Ianuarie 28, 2011, 23:15:31
Pana la urma cum e, trebuie ca toate nodurile sa aibe gradul par, sau pot exista fix 2 care au gradul impar :
A connected undirected graph is Eulerian if and only if every graph vertex has an even degree, or exactly two vertices have an odd degree.
Vad ca cele afirmatii se bat cap in cap ....


Titlul: Răspuns: 034 Ciclu Eulerian
Scris de: Pripoae Teodor Anton din Ianuarie 29, 2011, 02:42:11
Toate nodurile au grad par <=> exista ciclu eulerian
Toate nodurile au grad par cu exceptia a fix 2 <=> exista lant eulerian


Titlul: Răspuns: 034 Ciclu Eulerian
Scris de: Adelina Cristoiu din Februarie 19, 2011, 16:56:40
pentru prima figura (patratul cu doua diagonale ) care este solutia prin care nu treci de 2 ori printr-o latura si nu ridici creionul de pe foaie? ???


Titlul: Răspuns: 034 Ciclu Eulerian
Scris de: Paul-Dan Baltescu din Februarie 19, 2011, 20:55:54
Nu exista nici o solutie. Tocmai pentru ca graful respectiv nu e eulerian.


Titlul: Răspuns: 034 Ciclu Eulerian
Scris de: Alexandru-Iancu Caragicu din Ianuarie 07, 2012, 19:09:23
Graful e orientat sau neorientat?


Titlul: Răspuns: 034 Ciclu Eulerian
Scris de: Petru Trimbitas din Ianuarie 07, 2012, 19:15:33
Eu am rezolvat-o presupunand ca e neorientat.


Titlul: Răspuns: 034 Ciclu Eulerian
Scris de: Alexandru-Iancu Caragicu din Ianuarie 07, 2012, 19:33:44
Eu am rezolvat-o presupunand ca e neorientat.

Da, se vede ca e neorientat din exemplu. Ar trebui specificat.

LE: Se pot mari restrictiile problemei un pic sa nu fie nevoie sa faci parsare si alte lucruri de genul asta?


Titlul: Răspuns: 034 Ciclu Eulerian
Scris de: Pirtoaca George Sebastian din Iulie 10, 2012, 09:06:55
Sursa oficiala ia 60 de puncte cu TLE pe ultimul test. Cred ca ar trebui marita putin limita de timp (pentru 100 de puncte trebuie parsata citirea).


Titlul: Răspuns: 034 Ciclu Eulerian
Scris de: Mihai Calancea din Iulie 10, 2012, 12:00:31
Fixed.


Titlul: Răspuns: 034 Ciclu Eulerian
Scris de: UAIC.VlasCatalin din Iulie 30, 2012, 13:46:37
Nu pot sa inteleg de ce evaluatorul imi spune "Fisier de iesire corupt", numele la fisier este corect si la urma inchid fisierul , pls help  ](*,)


Titlul: Răspuns: 034 Ciclu Eulerian
Scris de: Lupicu din Martie 27, 2013, 21:35:17
Mie,pe testul de mai jos,algoritmul imi afiseaza 1 4 3 3 2 3 4 2 3 2 5 6 . Nu vad greseala din parcurgerea asta,insa evaluatorul imi da 0 puncte pe acest test (testul este din atasamentele evaluatorului). Ma poate lamuri cineva,va rog?  :D
6 12
2 5
2 3
3 3
4 3
6 1
3 2
1 4
3 2
5 6
2 4
4 3
3 2


Titlul: Răspuns: 034 Ciclu Eulerian
Scris de: Cotet Teodor din Octombrie 09, 2015, 00:11:44
A implementat cineva algoritmul lui Fleury?


Titlul: Răspuns: 034 Ciclu Eulerian
Scris de: Badita Marin-Georgian din Februarie 03, 2017, 09:02:42
Salutare, s-au schimbat cumva testele de la problema, aveam un algoritm pe care luam 100, acuma iau doar 80 pe el si in rest TLE
 :? :-'


Titlul: Răspuns: 034 Ciclu Eulerian
Scris de: Petru Trimbitas din Martie 05, 2017, 11:47:19
O solutie care pentru testul
2 2
1 2
1 2
afiseaza 1 2 1 (ultimul 1 nu ar trebui sa apara conform enuntului) ia 100 de puncte.