Aplicatie la algoritmul Roy-Floyd

Această secţiune se ocupă cu programarea, fără a ţine cont de limbaj. Dacă vrei (sau trebuie) să înveți algoritmică, aici este locul potrivit. Descrieri şi idei de algoritmi, algoritmi clasici și întrebări pe baza acestora, toate vor fi postate aici.

Aplicatie la algoritmul Roy-Floyd

Postby serj » 04 Jan 2012, 00:16

Va salut! Am intampinat de curand o problema la care nu ii gasesc raspunsul.Trag de mine de ceva vreme,dar tot nu reusesc sa conturez ceva.Dupa mai multe idei - nefinalizate,am ajuns la una - mai ,mai realizabila .

Ma gandeam sa formez matricea costurilor folosind Algoritmul Roy Floyd: pentru elementul A[i][j],cunoasteam costul minim de la nodul i la nodul j.Apoi formam toate lanturile posibile de la nodul i la j ( folosind cumva parcurgerea BFS ) si il alegeam pe cel de lungime maxima cu costul acesta minim. Problema e ca nu pot sa pun in aplicatie treaba cu toate lanturile, si mai e si vorba de ineficienta.
Voi ce ziceti ? Orice foarte mic indiciu/sau oricare alt raspuns va fi mai mult decat apreciat !

Roy-FloydCerinta
Micul Floyd locuieste intr-un oras mare, in care exista N intersectii. Fiecare pereche de intersectii este conectata printr-un drum bidirectional avand o lungime pozitiva data. Micul Floyd este un baiat curios si i-ar placea sa stie care este distanta minima pe care cineva ar trebui sa o parcurga de-a lungul drumurilor existente daca ar vrea sa mearga din intersectia X in intersectia Y. Deoarece ii plac foarte mult intersectiile ar vrea de asemenea sa stie, in cazul in care exista mai multe drumuri intre X si Y de aceeasi lungime minima, care este numarul maxim de strazi pe care ar putea sa mearga cineva pentru a obtine aceasta distanta minima.

Date de intrare
Prima linie a fisierului rf.in contine numarul de intersectii N. Urmatoarele N linii contin cate N numere intregi. Al j-ulea numar de pe a i-a linie reprezinta lungimea drumului dintre intersectiile i si j. Matricea data este simetrica. Intersectiile sunt numerotate cu numere intregi de la 1 la N.

Date de iesire
In fisierul rf.out afisati doua matrici de dimensiune NxN. Fiecare matrice va fi afisata pe cate N linii, fiecare continand cate N numere intregi, separate de cate un singur spatiu (fara spatii suplimentare la inceputul sau sfarsitul liniei). Prima matrice reprezinta lungimea minima a drumurilor intre fiecare pereche de intersectii. A doua matrice reprezinta numarul maxim de strazi pe care se poate merge pentru a obtine distanta minima intre oricare pereche de noduri. Al j-ulea numar de pe a i-a linie reprezinta, pentru fiecare dintre cele doua matrici, raspunsul pentru perechea (i, j) de intersectii.

Restrictii si precizari
1 ≤ N ≤ 256
Lungimea unui drum de la o intersectie la ea insasi va fi mereu 0
1 ≤ lungimea unui drum ≤ 100.000

Fisierul de intrare: rf.in
  1.  
  2. 5
  3. 0 2 3 4 5
  4. 2 0 4 5 1
  5. 3 4 0 1 2
  6. 4 5 1 0 3
  7. 5 1 2 3 0


Fisierul de iesire: rf.out
  1.  
  2. 0 2 3 4 3
  3. 2 0 3 4 1
  4. 3 3 0 1 2
  5. 4 4 1 0 3
  6. 3 1 2 3 0
  7.  
  8. 0 1 1 2 2
  9. 1 0 2 3 1
  10. 1 2 0 1 1
  11. 2 3 1 0 2
  12. 2 1 1 2 0
  13.  


P.S : Problema e dupa Infoarena

EDIT:


In caz ca a interesat pe cineva problema,aflati ca dupa o zi de cofruntari,aflu ca una dintre solutii se afla,asa evident.. printre comentarii.Pacat,eram increzator ca pot ajunge si eu la solutie ( azi,maine,saptamana care vine :))).
  1.  
  2. for(k=1;k<=n;k++)
  3.         for(i=1;i<=n;i++)
  4.             for(j=1;j<=n;j++) {
  5.                 if(roymin[i][j]==roymin[i][k]+roymin[k][j]) // daca am gasit alt lant cu costul minim
  6.                     roymax[i][j]=max(roymax[i][j],roymax[i][k]+roymax[k][j]);  //actualizez numarul de muchii
  7.                 else
  8.                     if(roymin[i][j]>roymin[i][k]+roymin[k][j]) {  //daca am gasit un cost mai mic
  9.                         roymin[i][j]=roymin[i][k]+roymin[k][j];     //actualizez atat costul
  10.                         roymax[i][j]=roymax[i][k]+roymax[k][j];                                //cat si numarul de muchii
  11.                     }
  12.             }
  13.  

roymin e matricea costurilor: roymin[i][j]=x,unde x este costul minim de la nodul i la nodul j
roymax e matricea ce retine numarul maxim de drumuri de la nodul i : roymax[i][j]=x,unde x este numarul de drumuri maxim de la nodul i la nodul j
0,0p / 0 votes
Image
User avatar
serj
Bit
 
Joined: 12 Oct 2011
Status: 0

Return to Algoritmică

Who is online

Users browsing this forum: No registered users and 0 guests