algoritmul lui dijkstra si roy floyd (1)
DESCRIPTION
AlgoritmTRANSCRIPT
Algoritmul lui Dijkstra
Algoritmul lui Dijkstra
Este un algoritm utilizat pentru determinarea drumurilor de cost minim de la o surs unic. Este un algoritm de tip Greedy, pentru determinarea drumului minim de la un nod surs la toate celelalte noduri ale grafului.
Pentru a reprezenta reeaua, presupunem o funcie valoare astfel nct valoare(i, j) este valoarea arcului de la nodul i la nodul j. Dac nu exist un arc de la nodul i la nodul j atunci valoare(i, j) este setat la o valoare arbitrar mare, care indic costul infinit (imposibilitatea) de a merge direct de la nodul i la nodul j.
Dac toate valorile sunt pozitive, urmtorul algoritm atribuit lui Dijkstra, determin cel mai scurt drum de la nodul s la nodul t al grafului. Un astfel de drum se numete drum special. Pentru a reine costurile drumurilor speciale vom utiliza un tablou numit distan cu proprietatea c distan(i( conine costul celui mai scurt drum de la nodul s la nodul i.
Iniial distan(s( = 0 i distan(i( = INFINIT pentru orice nod i diferit de nodul s, unde INFINIT este un numr foarte mare.
Evident, cel mai scurt drum de la nodul s la un nod oarecare al grafului este dat de arcul (s, j) de valoare minim. Alegem n continuare un drum n ordinea cresctoare a costurilor pn cnd am determinat drumuri de distan minim de la nodul s la oricare dintre nodurile grafului pentru care exist un drum ncepnd din nodul s. Reamintesc, matricea costurilor se definete astfel:
mcij=costul arcului, dac arcul (i,j) exist
0, dac i=j
, dac arcul (i,j) nu exist i este o problem de minim /
(-, dac este o problem de maxim)Pentru arcele inexistente se reine valoarea pentru algoritmii de minim respectiv pentru algoritmii de maxim. n practic, aceste valori sunt nite valori foarte mari pe care n mod normal nu pot lua valorile arcelor.Exemplu: pentru graful din figura 2.1.4 iniial, matricea costurilor este:
Datele se citesc, de obicei din fiier. Pentru exemplul de mai sus, fiierul de intrare ar putea fi urmtorul (pe prima linie este scris numrul de noduri i pe urmtoarele linii sunt scrise cte trei numere reprezentnd capetele arcelor i costul arcului). Ordinea n care sunt scrise arcele nu este unic.
graf.txt
6
1 2 1
2 3 7
2 5 1
1 5 3
5 3 2
3 4 1
6 4 4
6 1 1
Implementarea algoritmului Dijkstra folosind reprezentarea cu matrice de costuri:
La citirea datelor din fiier se completeaz matricea costurilor cu valoarea citit, dac exist arcul sau cu o valoare foarte mare, echivalentul , dac arcul nu exist.
Se vor folosi trei vectori:
-un vector viz, care iniial are, pentru toate componentele valoarea 0; la alegerea unui nod acesta va deveni vizitat, valoarea corespunztoare nodului n vectorul viz va deveni 1.
-un vector dr care reine pentru fiecare nod, nodul precedent al su, n drumul de cost minim; dac nu exist un predecesor al nodului curent, in vectorul dr se reine valoarea -1.
-un vector lung, care reine lungimea drumului minim de la nodul de plecare la toate celelalte noduri ale grafului. Iniial, vectorul lung primete valorile din matricea de costuri, aceast valoare urmnd a fi mbuntit.
Algoritmul lui Dijkstra:
Pas1. Se creaz matricea costurilor, se citete nodul de plecare i se iniializeaz vectorii viz, dr i lung. Se viziteaz nodul de plecare, nodul precedent lui se reine a fi nodul 0, n sensul c nu exist un asemenea nod.
Pas 2. Pentru celelalte n-1 noduri ale grafului se determin nodul pentru care costul de la nodul curent este minim i se reine nodul (k) pentru care se realizeaz valoarea minim. Dac costul drumului la nodul k nu este infinit, se va vizita nodul k. Se actualizeaz drumurile spre toate nodurile folosind minimul determinat spre nodul k. Dac exist un nod j cu proprietatea c lung[j]>lung[k]+mc[k][j], atunci nseamn c precedentul lui j este k dr[j]=k i lung[j]=lung[k]+mc[k][j].
Pas 3. Afiarea drumurilor anterior determinate. Dac lung[i]=max, nseamn c nu exist drum, altfel se afieaz drumul determinat de la nodul iniial la fiecare din nodurile 1, 2, ..., n.
Observaie: determinarea drumului se realizeaz printr-o funcie recursiv drum care parcurge vectorul dr pn la ntlnirea valorii 0 din acest vector, valoare care se intlnete pentru nodul iniial.
Exemplu: s considerm graful din figura 2.1.4 i pentru acesta s considerm nodul 1 ca fiind nodul de plecare. Iniial vectorii dr, lung i viz sunt:
12
3
456viz10000012
3
456lung01-1-13-112
3
456dr000000
Modificarea vectorilor dr, lung i viz va fi prezentat n tabelul urmtor.
Lungimea minimNodul selectatEvoluia vectorilor viz, dr i lung
1212
3
456viz11000012
3
456lung018-12-112
3
456dr012020
1512
3
456viz11001012
3
456lung014-12-112
3
456dr015020
2312
3
456viz11101012
3
456lung01452-112
3
456dr015320
1412
3
456viz11111012
3
456lung01452012
3
456dr01532-1
16, dar nu se poate forma drum spre 612
3
456viz11111112
3
456lung01452012
3
456dr01452-1
Programul care realizeaz
#include#define max 32000
int mc[20][20],n,viz[20],dr[20],lung[20];
void citire()
{ int i,j,x,y,c;
ifstream f("graf.txt");
f>>n;
for (i=1;ix>>y>>c)
mc[x][y]=c;
f.close();
}
void drum(int i) //realizeaz afisarea drumului determinat{ if (i)
{ drum(dr[i]);
cout