algoritmul lui dijkstra si roy floyd (1)

Upload: alfred-thomas

Post on 07-Jan-2016

355 views

Category:

Documents


12 download

DESCRIPTION

Algoritm

TRANSCRIPT

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