Вы находитесь на странице: 1из 4

#include <iostream.

h>
#include <fstream.h>
int a[100][100], n,m,x,y,n1,n2,i, VIZ[500]={0},v[100]
[100]={0},j,d[20],t[100],p[100],s,op,suc[100],pred[100], nrc;
char ora[100][20], oras[20];
const int max=15000;
ifstream f("date.in");
ifstream f1("date1.in");
ofstream g("date.out");
void parcurgere_BF(char ni,int n2)
{int C[50], i, p, u, v,ok=1;
for(i=1;i<=n; i++)
VIZ[i]=0;
C[1]=ni;
VIZ[ni]=1;
p=1;
u=1;
while(p<=u)
{v=C[p++];
for(i=1; i<=n&&ok==1; i++)
if(a[v][i]==1&&VIZ[i]==0)
{C[++u]=i;
VIZ[i]=1;
if(u==n2)
ok=0;}
}
for(i=1; i<=u; i++)
cout<<ora[C[i]]<<" ";
}
void dfmr(int nod)
{cout<<ora[nod]<<" ";
VIZ[nod]=1;
for(int k=1;k<=n;k++)
if(a[nod][k]==1&&VIZ[k]==0)
dfmr(k);
}
void rw()
{int i, j, k;
for(k=1;k<=n;k++)
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(i!=j)
if(v[i][j]==0)
v[i][j]=v[i][k]*v[k][j];
}
void dijkstra(int s)
{int i,j,k,min;
for(i=1;i<=n;i++)
{d[i]=a[s][i];
if(i!=s && d[i]!=max)
t[i]=s;
}
p[s]=1;
for(k=1;k<n;k++)
{min=max;
for(i=1;i<=n;i++)
if(!p[i] && d[i]<min)
{min=d[i];
j=i;}
for(i=1;i<=n;i++)
if(!p[i])
if(d[i]>d[j]+a[j][i])
{d[i]=d[j]+a[j][i];
t[i]=j;}
p[j]=1;
}
}
void drum(int i)
{ if(t[i])
drum(t[i]);
g<<ora[i]<<" ";
}
void dfsuc(int nod)
{int k;
suc[nod]=nrc;
for(k=1;k<=n;k++)
if(a[nod][k]==1 && suc[k]==0)
dfsuc(k);
}
void dfpred(int nod)
{int k;
pred[nod]=nrc;
for(k=1;k<=n;k++)
if(a[k][nod]==1 && pred[k]==0)
dfpred(k);
}
int main()
{f>>n>>m;
for(i=1; i<=m; i++)
{f>>x>>y;
a[x][y]=1;}
for(i=0; i<=n; i++)
f.getline(ora[i],20);
//f.getline();}
cout<<"Buna ziua !Introdu tasta corespunzatoare fiecarei operatii";
cout<<endl;
cout<<"1.Doresti sa afli care sunt cele n orase pe care le poate acoperi un
distribuitor"; cout<<endl;
cout<<"2.Doresti sa afli toate orasele in care poate ajunge un distribuitor
aflat intr-un oras k"; cout<<endl;
cout<<"3.Doresti sa afli toate orasele intre care exista o legatura"<<endl;
cout<<"4.Sa afli drumul minim dintr-un oras catre celelalte in care ai
filiale" ;cout<<endl;
cout<<"5. Doresti sa afli de cati distribuitori ai nevoie si care sunt orasele
pe care le poate acoperi"; cout<<endl;
cin>>op;
if(op==1)
{cout<<"Orasul din care pleaca="; cin>>oras;
cout<<"In cate orase vrei sa ajungi="; cin>>n2;
for(i=1; i<=n; i++)
if(strcmp(ora[i], oras)==0)
n1=i;
parcurgere_BF(n1,n2);}
if(op==2)
{cout<<"Orasul din care pleaca"; cin>>oras;
for(i=1; i<=n; i++)
if(strcmp(ora[i], oras)==0)
n1=i;
dfmr(n1);}
if(op==3)
{for(i=1;i<=n;i++) //matricea drumurilor
for(j=1;j<=n;j++)
v[i][j]=a[i][j];
rw();
cout<<"Am afisat datele intr-un fisier text";
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(v[i][j]!=0)
{g<<ora[i]<<"->"<<ora[j];
g<<endl;}}
if(op==4)
{f1>>n>>m; //djakstra
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(i==j)
a[i][j]=0;
else
a[i][j]=max;
for(i=1;i<=m;i++)
{f1>>x>>y>>n1;
a[x][y]=n1;
}
cout<<"Orasul pentru care vrei sa afli drumul minim="; cin>>oras;
for(i=1; i<=n; i++)
if(strcmp(ora[i], oras)==0)
s=i;
dijkstra(s);
cout<<"Am afisat datele in fisier text ";
for(int i=1;i<=n;i++)
if(i!=s)
{g<<ora[s]<<"->"<<ora[i]<<"; Traseul este urmatorul:";
drum(i);
if(d[i]==max)
g<<" : Afacere neprofitabila"<<endl;
else
g<<",iar distanta este urmatoarea ="<<d[i]<<"km"<<endl;
}
}
if (op==5)
{cout<<"Am afisat datele in fisier text :)";
nrc=1;
for(int i=1;i<=n;i++)
if(suc[i]==0)
{dfsuc(i);
dfpred(i);
for(int j=1;j<=n;j++)
if(suc[j]!=pred[j])
suc[j]=pred[j]=0;
nrc++;
}
g<<"Ai nevoie de "<<nrc-1<<" distribuitori"<<endl;
for(i=1;i<nrc;i++)
{g<<"Distribuitorul "<<i <<" poate acoperi orasele:";
for(int j=1;j<=n;j++)
if(suc[j]==i)
g<<ora[j]<<" ";
g<<endl;
}}
f.close();
return 0;}
date.in
6 8
1 2
1 3
1 6
2 3
2 6
3 1
3 5
4 5
Arad
Bacau
Botosani
Cluj
Deva
Iasi

date1.in
6 8
1 2 1
1 3 10
1 6 4
2 3 2
2 6 2
3 1 3
3 5 2
4 5 1

Вам также может понравиться