Sunteți pe pagina 1din 11

Dijkstragenerare

cost minim
Dragomir Theodora
Dovleac 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 relaxri repetate (consta in
testarea daca se poate reduce costul ei, trecnd
printr-un nod intermediar u).

Algoritmul lui Dijkstra


Dijkstra poate fi folosit doar in grafuri care au toate
muchiile nenegative.
Algoritmul este de tip Greedy: optimul local cutat
este reprezentat de costul drumului dintre nodul
sursa s si un nod v. Pentru fiecare nod se retine un
cost estimat d[v], iniializat la nceput cu costul
muchiei s v, sau cu +, daca nu exista muchie.

Madrid= nod 1,nod sursa


Barcelona =nod 2
Lyon=nod 3
Paris=nod 4
Berlin=nod 5
Munchen=nod 6
Bucuresti= nod 7
Arad=nod 8
Kiev= nod 9
Moscova=nod 10

muchia
12
17
23
27
34
36
45
46
56
5-10
68
78
89
9-10

costul
10
50
15
48
10
30
20
25
20
60
40
5
30
45

MOSCOVA

MADRID

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;
}
}

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])

IN C++
{
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;

IN C++

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);
}

S-ar putea să vă placă și