11
Dijkstra- generare cost minim Dragomir Theodora Dovleac Ana Daniela Clasa XI F Prof. Coordonator – Carmen Splais

Dijk Stra

Embed Size (px)

DESCRIPTION

Proiect

Citation preview

Page 1: Dijk Stra

Dijkstra-generare cost minim

Dragomir TheodoraDovleac Ana Daniela

Clasa XI F

Prof. Coordonator – Carmen Splais

Page 2: Dijk Stra

Urmatorul program determina drumul de cost minim de la un nod sursa, la restul nodurilor din graf, pe baza de relaxări repetate (consta in testarea daca se poate reduce costul ei, trecând printr-un nod intermediar u).

Algoritmul lui DijkstraDijkstra poate fi folosit doar in grafuri care au toate muchiile nenegative.Algoritmul este de tip Greedy: optimul local căutat este reprezentat de costul drumului dintre nodul sursa s si un nod v. Pentru fiecare nod se retine un cost estimat d[v], inițializat la început cu costul muchiei s → v, sau cu +∞, daca nu exista muchie.

Page 3: Dijk Stra
Page 4: Dijk Stra

Madrid= nod 1,nod sursaBarcelona =nod 2Lyon=nod 3Paris=nod 4Berlin=nod 5Munchen=nod 6Bucuresti= nod 7Arad=nod 8Kiev= nod 9Moscova=nod 10

muchia costul12 1017 5023 1527 4834 1036 3045 2046 2556 205-10 6068 4078 589 309-10 45

Page 5: Dijk Stra

MADRID

MOSCOVA

Page 6: Dijk Stra

IN C++#include<iostream>#include<fstream>#include<string.h>using namespace std;int a[100][100],d[100],s[100],p[100],n,m;int const pinf=500000;char aeroport[40][40];

void aeroporturi(){ ifstream cit("destinatii.txt"); string line; int i=1; strcpy(aeroport[1],"Madrid"); while(getline(cit, line)) { i++; cit.get(aeroport[i],20); } cit.close();}

Page 7: Dijk Stra

IN C++void citire(){ int i,j,x,y,c; ifstream f("date.txt"); f>>n>>m; for(i=1;i<=n;i++) for(j=1;j<=n;j++) if(i==j) a[i][j]=0; else a[i][j]=pinf; for(i=1;i<=m;i++) { f>>x>>y>>c; a[x][y]=a[y][x]=c; }}

Page 8: Dijk Stra

IN C++void generare_drum(i ntx){ int i,j,min,y; s[x]=1; for(i=1;i<=n;i++) { d[i]=a[x][i]; if(i!=x && d[i]<pinf) p[i]=x; } for(i=1;i<=n;i++) { for(j=1,min=pinf;j<=n;j++) if(s[j]==0 && d[j]<min) { min=d[j]; y=j; } s[y]=1; for(j=1;j<=n;j++) if(s[j]==0 && d[j]>d[y]+a[y][j])

{ d[j]=d[y]+a[y][j]; p[j]=y; } }}

Page 9: Dijk Stra

IN C++void drum(int i){ if(p[i]!=0) drum(p[i]); cout<<aeroport[i]<<"-";}void afisare(int x,int i){ if(i!=x) if(p[i]!=0) { cout<<"Drumul cu costul minim de la "<<aeroport[x]; cout<<" la "<<aeroport[i]<<" are costul "<<d[i]<<" euro "<<endl; drum(i); cout<<endl; } else cout<<" Nu exista drum de la "<<aeroport[x]<<" la "<<aeroport[i]<<endl;}

Page 10: Dijk Stra

IN C++int main(){citire();aeroporturi();int x1,x2;char pplecare[30];char psosire[30];cout<<"Introduceti punctul de plecare ";cout<<endl;cin.get(pplecare,29);if(pplecare[0]>='a' && pplecare[0]<='z') {cout<<"Tarile se scriu cu litera mare,incultule!"; pplecare[0]=pplecare[0]-32;} cout<<endl;

Page 11: Dijk Stra

cin.get();cout<<"Introduceti sosire ";cout<<endl;cin.get(psosire,29);if(psosire[0]>='a' && psosire[0]<='z') {cout<<"LITERA MARE!"; psosire[0]=psosire[0]-32;} cout<<endl;for(int i=1;i<=10;i++){ if(strncmp(pplecare,aeroport[i],strlen(pplecare))==0) x1=i; if(strncmp(psosire,aeroport[i],strlen(psosire))==0) x2=i;} generare_drum(x1); afisare(x1,x2);

}

IN C++