Sunteți pe pagina 1din 4

Algoritmul lui Roy-Floyd

Fie G=(V, E) un graf neorientat, unde V are n elemente (n noduri) si E are m


elemente (m muchii) memorat prin matricea ponderilor. Se cere ca pentru două
noduri x,y citite sa se determine lungimea minimă a lanțului de la x la y.

Astfel:

Initial matricea ponderilor pentru nodurile 1 si 4 va retine 10. Se observă


ca lanțul 1,2,3,4 determina o suma a costurilor mai mică: 2+3+1=6. Lungime minima
a lanțului de la 1 la 4 este 6.

Algoritmul:
-se genereaza matricea ponderilor:
0 2  10 
2 0 3 
3 0 1 8
10  1 0 
8 0
Unde pinf reprezinta plus infinit

-se încearcă pentru oricare pereche de noduri i,j să se obțina “drumuri” mai scurte
prin noduri intermediare k (k1…n).

Acest lucru se determina comparand “lungimea” lantului a[i,j] cu lungimea lantului


care trece prin k si daca:
a[i,j] > a[i,k]+a[k,j] atunci se atribuie: a[i,j]  a[i,k]+a[k,j]
Astfel generarea matricii drumurilor optime se realizează cu urmatoarea secvență:

for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(a[i][j]>a[i][k]+a[k][j])
a[i][j]=a[i][k]+a[k][j];
Se obtine:
0 2 5 6 13
2 0 3 4 11
5 3 0 1 8
6 4 1 0 9
13 11 8 9 0

In continuare, după determinarea matricii lanțurilor optime, pentru două noduri citite
x, y se cere să se reconstituie un lanț optim de la x la y (pot fi mai multe solutii).

Solutie:
-se determină dacă există un lanț de la x la y (ar putea să nu existe un astfel de lanț
dacă graful nu este conex):
când a[x,y] 
-se descompune “drumul” de la x la y prin k atunci
când: a[x][y]=a[x][k]+a[k][y];

Enunț:
Se dă un graf orientat ponderat cu n noduri și m arce – în care fiecare arc are asociat
un cost, număr natural strict pozitiv. Folosind algoritmul Roy-Floyd, construiți
matricea costurilor minime, a[i][j] fiind costul minim al unui drum de la i la j, dacă
există un asemenea drum, sau -1 în caz contrar.

Date de intrare
Fișierul de intrare roy-floyd.in conține pe prima linie numerele n m, iar următoarele
linii câte un triplet i j c, cu semnificația: există arcul (i j) și are costul c.

Date de ieșire
Fișierul de ieșire roy-floyd.out va conține matricea construită, câte o linie a matricei
pe o linie a fișierului, elementele de pe fiecare linie fiind separate prin exact un spațiu.

#include <bits/stdc++.h>
#define INF 1000000000
using namespace std;
int n, m, i, j, k, c, a[105][105];
int main()
{
ifstream f("roy-floyd.in");
ofstream g("roy-floyd.out");
f >> n >> m;
for(i = 1; i <= n; i ++)
{
for(j = 1; j <= n; j ++)
a[i][j] = INF;
a[i][i] = 0;
}
while(m)
{
f >> i >> j >> c;
a[i][j] = c;
m --;
}
for(k = 1; k <= n; k ++)
for(i = 1; i <= n; i ++)
for(j = 1; j <= n; j ++)
if(a[i][j] > a[i][k] + a[k][j])
a[i][j] = a[i][k] + a[k][j];
for(i = 1; i <= n; i ++)
{
for(j = 1; j <= n; j ++)
if(a[i][j] == INF) g << -1 << " ";
else g << a[i][j] << " ";
g << "\n";
}
return 0;
}

Probleme propuse:

▪ Între n statii spatiale se stabilesc trasee. Se cunosc traseele directe intre perechi de
statii si distanta dintre ele. Sa se determine drumul minim intre doua statii date stiind
ca nu pot fi doua statii pare una dupa cealalta. Sa se afiseze drumul de la statia x la
statia y.

▪ Reteaua de strazi a unui oras este reprezentata prin nodurile intersectii ale orasului.
Din intersectiile A si B pleaca doi pietoni spre intersectiile x, respectiv y. Ei conosc
bine orasul si merg spre destinatie pe drumul minim. Stabiliti daca traseele au trecut
prin puncte comune si care sunt aceste intersectii. Determinati daca exista intersectiile
in care s-au intalnit.
▪ Intr-o tabara, elevii au n puncte de plecare (cantina, corturile, stejarul
cel batran etc.). Initial, deplasarea intre oricare doua puncte se face intr-un timp t, insa
organizatorii au amplasat m obstacole pe traseele dintre aceste puncte. Cu fiecare
obstacol care trebuie depasit, elevii pierd 30 de secunde. Pe un traseu pot fi mai multe
obstacole. Elevii vor sa ajunga din punctul X in punctul Y, pe drumul cel mai
scurt. Scrieti un program care citeste n, X, Y. Apoi m perechi de puncte intre care sunt
amplasate obstacole si afiseaza drumul cel mai rapid intre X si Y.