Upload
ana-daniela
View
212
Download
0
Embed Size (px)
DESCRIPTION
Proiect
Citation preview
Dijkstra-generare cost minim
Dragomir TheodoraDovleac Ana Daniela
Clasa XI F
Prof. Coordonator – Carmen Splais
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.
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
MADRID
MOSCOVA
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();}
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; }}
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; } }}
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;}
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;
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++