Pagini: [1]   În jos
  Imprimă  
Ajutor Subiect: Algoritmul Ungar  (Citit de 3293 ori)
0 Utilizatori şi 1 Vizitator pe acest subiect.
VladS
Vizitator
« : Decembrie 06, 2005, 17:13:42 »

Ar putea sa-mi dea si mie o sursa cu Algoritmul Ungar scrisa in C/C++ sau un link de pe care sa inteleg.
Stiu ca s-a dat o problema de cuplaj la runda 6 campion 2004, numai ca solutia oficiala era cu Ford-Fulkerson. Ruleaza aceasta la fel de bine ca algoritmul Ungar ?
Parca a mai fost si un referat la lot pe tema asta. Daca l-ar putea pune cineva la download i-as fi recunoscator.
Memorat
greco
Nu mai tace
*****

Karma: 144
Deconectat Deconectat

Mesaje: 434



Vezi Profilul
« Răspunde #1 : Decembrie 06, 2005, 18:44:13 »

Am sters tot, probabil ca Cosmin are dreptate.
Memorat

Jump in the cockpit and start up the engines
Remove all the wheelblocks there's no time to waste
Gathering speed as we head down the runway
Gotta get airborne before it's too late.
Cosmin
Echipa infoarena
Nu mai tace
*****

Karma: 351
Deconectat Deconectat

Mesaje: 1.799



Vezi Profilul
« Răspunde #2 : Decembrie 06, 2005, 19:25:50 »

Mai articolele trimise la ginfo intra sub ceva drepturi de copyrigth ... si ar trebui sa astepti macar o luna dupa ce apare ginfo sa pui articolul online ca altfel ce rost are sa il mai bagam ...
Memorat
vladcyb1
Vorbaret
****

Karma: 33
Deconectat Deconectat

Mesaje: 166



Vezi Profilul
« Răspunde #3 : Decembrie 06, 2005, 20:54:03 »

Uite cum fac eu cuplajul maxim intr-un graf bipartit...Sursa nu este cea mai frumos scrisa dar poti sa ti faci o idee din ea. Algoritmul cupleaza nodurile folosind un greedy si apoi se bazeaza pe teorema lui Berge care zice ca atata timp cat mai exista drumuri alternante cuplajul nu este maxim. Prin drum alternant inseamna o succesiune de noduri in care unul e cuplat celalalt nu este. In momentul cand am gasit un astfel de drum inversez cuplajul si astfel el creste cu o muchie.

Cod:


type Graf=array [1..100,1..100] of integer;

var G:Graf;
    p, n, k, C, M, i, j     :integer;
    NrV, Cuplat    :array [1..100] of integer;
    marcat              :array [1..100] of boolean;
    Primul, GasitDrum    :boolean;
    act:boolean;

 procedure citire;
 var f:text;
     i,j:integer;
  begin
  assign(f,'cuplaj.in');
  reset(f);
  readln(f,n,k);
  for i:=1 to n do
   begin
   read(f,nrv[i]);
   for j:=1 to nrv[i] do read(f,g[i,j]);
   readln(f);
   end;
   close(f);
 end;

 procedure df_cuplu(x,tip:integer);
 var i,vec:integer;
  begin
  marcat[x]:=true;
  if primul then
   begin
   gasitdrum:=false;
   primul:=false;
   end
   else
   if cuplat[x]=0 { daca nu e primul si nu e cuplat inseamna ca am gasit un drum}
   then begin
        gasitdrum:=true;
        inc(m);
        end;
   i:=0;
    while (i<nrv[x])and(not gasitdrum) do
     begin
     inc(i);
     vec:=g[x,i];
     if (tip=0)and(not marcat[vec])and(cuplat[vec]<>x) then df_cuplu(vec,1);
     if (tip=1)and(not marcat[vec])and(cuplat[vec]=x) then df_cuplu(vec,0);
     if (gasitdrum)and(tip=0) then begin
                                   cuplat[x]:=vec;
                                   act:=true;
                                   cuplat[vec]:=x;
                                   end;
     end;
  end;

 procedure cupleaza_randomizat;
 var i,j:integer;
  begin
  fillchar(cuplat,2*n,0);
   m:=0;
   for i:=1 to k do
    if cuplat[i]=0 then
     for j:=1 to nrv[i] do
      if cuplat[g[i,j]]=0 then begin
                          cuplat[i]:=g[i,j];
                          cuplat[g[i,j]]:=i;
                          inc(m);
                          break;
                          end;
   end;

begin
  Citire;
  M:=0;
 cupleaza_randomizat;
  repeat
  act:=false;
  p:=1;
   while p<=n do
    begin
    if cuplat[p]=0 then begin
                  Primul:=true;
                  for i:=1 to 2*n do marcat[i]:=false;
                  df_cuplu(p,0);
                  end;
   inc(p);
   end;
  until not act;
assign(output,'cuplaj.out'); rewrite(output);
writeln(M);
close(output);
end.
Memorat

Vlad Berteanu
wickedman
Echipa infoarena
Nu mai tace
*****

Karma: 227
Deconectat Deconectat

Mesaje: 670



Vezi Profilul WWW
« Răspunde #4 : Decembrie 07, 2005, 12:10:07 »

Cine bagă un articol despre cuplaje sau despre alg. ungar?
Memorat
domino
Echipa infoarena
Nu mai tace
*****

Karma: 281
Deconectat Deconectat

Mesaje: 1.340



Vezi Profilul WWW
« Răspunde #5 : Decembrie 07, 2005, 14:08:42 »

Despre ungar a scris greco in GInfo si peste 1 luna va aparea si la noi articolul respectiv.
Memorat
Pagini: [1]   În sus
  Imprimă  
 
Schimbă forumul:  

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