Advertisement
aimon1337

Untitled

Jun 2nd, 2020
337
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.49 KB | None | 0 0
  1. /*Harta unui oras este impartita in n intersectii si m strazi cu sens unic intre intersectii, fiecare strada avand o lungime.
  2. Pentru doua intersectii i si j poate exista atat strada de la i la j, cat si de la j la i. Intr-o intersectie x se gaseste Julieta
  3. si intr-o intersectie y se gaseste Romeo. Cei doi se pot deplasa pe strazi in sensurile de parcurgere ale acestora. Determinati
  4. intersectia in care trebuie sa se intalneasca cei doi astfel incat sa parcurga in total o distanta minima. Pentru solutia obtinuta
  5. afisati intersectia, distanta parcursa de Julieta, distanta parcursa de Romeo si traseul parcurs de fiecate dintre ei.
  6. Datele de intrare asigura ca cei doi se pot intalni.
  7. */
  8. #include <iostream>
  9. #include <fstream>
  10. //#include <cmath>
  11. //#include <algorithm>
  12. using namespace std;
  13. ifstream f("date.in");
  14. const int mxn=1e3;
  15. const int nax=1e5;
  16. const int inf=1e9;
  17. int a[mxn][mxn],dr[nax],dj[nax],g[nax],v1[nax],n,m,x,y,v2[nax], tj[nax], tr[nax];
  18. void citire()
  19. {   int i,j,k,cost;
  20.     f>>n>>m;
  21.     for(i=1; i<=n; i++)
  22.         for(j=1; j<=n; j++)
  23.             if(i==j) a[i][j]=0;
  24.             else a[i][j]=inf;
  25.     for(k=1; k<=m; k++)
  26.     {   f>>i>>j>>cost;
  27.         a[i][j]=cost;
  28.     }
  29.     f.close();
  30.     cin>>x>>y;
  31. }
  32.  
  33. void dijkstra(int s)
  34. {   int i,j,k,minn;
  35.     for(i=1; i<=n; i++)
  36.     {
  37.         g[i]=a[s][i];
  38.         if(i!=s && g[i]!=inf) v2[i]=s;
  39.         else v2[i]=0;
  40.         v1[i]=0;
  41.     }
  42.  
  43.     v1[s]=1;
  44.     for(k=1; k<n; k++)
  45.     {   minn=inf;
  46.         for(i=1; i<=n; i++)
  47.             if(!v1[i] && g[i]<minn)
  48.             {   minn=g[i];
  49.                 j=i;
  50.             }
  51.         for(i=1; i<=n; i++)
  52.             if(!v1[i] && g[i]>g[j]+a[j][i])
  53.             {   g[i]=g[j]+a[j][i];
  54.                 v2[i]=j;
  55.             }
  56.         v1[j]=1;
  57.     }
  58. }
  59.  
  60. void drum(int i, int t[200])
  61. {   if(v2[i]) drum(v2[i],t);
  62.     cout<<i<<" ";
  63. }
  64.  
  65. int main()
  66. {   int i,minn=100000,imin;
  67.     citire();
  68.     dijkstra(x);
  69.     for(i=1; i<=n; i++) {
  70.         dj[i]=g[i];
  71.         tj[i]=v2[i];
  72.     }
  73.     dijkstra(y);
  74.     for(i=1; i<=n; i++) {
  75.         dr[i]=g[i];
  76.         tr[i]=v2[i];
  77.     }
  78.     for(i=1; i<=n; i++)
  79.         if(dj[i]+dr[i]<minn)
  80.         {
  81.             minn=dj[i]+dr[i];
  82.             imin=i;
  83.         }
  84.     cout<<"intersectia: "<<imin<<endl;
  85.     cout<<"Julieta merge: "<<dj[imin]<<endl;
  86.     cout<<"Romeo merge: "<<dr[imin]<<endl;
  87.     cout<<"Traseul Julietei: ";
  88.     drum(imin,tj);
  89.     cout<<"\nTraseul lui Romeo: ";
  90.     drum(imin,tr);
  91.     cout<<"\n"; return 0;
  92. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement