You are on page 1of 3

Orice aeroport are zboruri de legatura cu alte aeroporturi, numite si rute.

Fiecare ruta reprezinta traseul pe care un avion il face din si inspre un aeropo
rt.
Nu exista o ruta intre fiecare aeroport de aceea un avion pentru a parcurge drum
ul dintre A si B (in cazul in care nu exista drum direct) este nevoit sa faca o
escala in aeroportul C.
O agentie turistica are nevoie de un program care sa organizeze cel mai scurt dr
um intre aeroportul de plecare si destinatie.
Tot odata sa se afiseze si escalele pe care le face avionul (daca exista).
Agentia isi stabileste un pret al biletului in functie de kilometrii parcursi, s
e cere sa se afle si pretul biletului.
5 // numarul de noduri
matricea
Numele statiilor
vectorul care indica statiile de intersectie toate numetele sunt 0, statiile de
intersectie sunt 1
vectorul care arata pe ce magistrala sunt statiile
0 3 32000 32000 32000 32000 3 4 32000 32000
3 0 2 32000 32000 32000 32000 32000 32000 32000
32000 2 0 4 32000 32000 32000 32000 32000 32000
32000 32000 4 0 3 32000 32000 32000 32000 32000
32000 32000 32000 3 0 4 32000 32000 4 3
32000 32000 32000 32000 4 0 2 32000 32000 32000
3 32000 32000 32000 32000 2 0 32000 32000 32000
4 32000 32000 32000 32000 32000 32000 0 15 32000
32000 32000 32000 32000 4 32000 32000 15 0 32000
32000 32000 32000 32000 3 32000 32000 32000 32000 0
#include <fstream>
#include <iostream>
#include <string>
usingname space std;
fstream fin("date.in");
int c[100][100],n,a,b,m[100],m1[100], *p;
char nume[100];
void roy_floyd() //calculeaza cel mai scrut drum intre doua puncte
{ int i,j,k;
for(k=1;k<=n;k++)
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(c[i][j]>c[i][k]+c[k][j])
c[i][j]=c[i][k]+c[k][j];
}
void drum(int i, int j)
{int k, ok=0;
k=1;
while(k<=n && ok==0)
{ if(k!=i && k!=j && c[i][k]+c[k][j]==c[i][j])
{ok=1;
drum(i,k);
drum(k,j);
}
k++;}
if(ok==0)
{cout<<" "<<nume[j];
// if(m1[j]==1 && m1[i]!=m1[j])

// cout<<"(trebuie sa schimbati magistrala)";
}
}
void drum2(int i, int j,int p)
{int k, ok=0;
k=1;
while(k<=n && ok==0)
{ if(k!=i && k!=j && c[i][k]+c[k][j]==c[i][j])
{ok=1;
drum(i,k,p);
drum(k,j,p);
}
k++;}
if(ok==0 && m1[p] !=m1[k])
{c[i][j]=c[i][j]+5;
p=k;
}
}
int main()
{int i,j;
fin>>n;
cout<<"Plecare din: "; cin>>a;cout<<endl;
cout<<"Destinatie: "; cin>>b;cout<<endl;
for(i=1;i<=n;i++) //citesc matricea costurilor
for(j=1;j<=n;j++)
fin>>c[i][j];
for(i=1;i<=n;i++) // citesc vectorul cu numele statiilor
{ cin.get(nume,100);
fin.get();
}
for(i=1;i<=n;i++) //citesc vectorul cu indicarii care sunt statiile de intersect
ie (cele de intersectie cun 1 iar restul sunt 0)
fin>>m[i];
for(i=1;i<=n;i++) //citesc vectorul cu indicatiile pe ce magistrala se afla fiec
are statie.
fin>>m1[i];
roy_floyd();
drum2(a,b,p);
cout<<" Cel mai scurt drum este de: "<<c[a][b]<<" minute";
cout<<endl;
cout<<" Drumul ";cout<<endl;
drum(a,b);
cout<<endl;
return 0;
}

You might also like