Advertisement
Tucancitto

Lab3 - Pb2

Apr 8th, 2021 (edited)
54
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.24 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <vector>
  4. #include <queue>
  5. #include <climits>
  6. using namespace std;
  7.  
  8. struct GRAF
  9. {
  10.     vector<vector<int>> ListaAdiac;
  11.     void citire(string fisier)
  12.     {
  13.         ifstream fin(fisier);
  14.         if (!fin)
  15.         {
  16.             cout << "Eroare. \n";
  17.             return;
  18.         }
  19.  
  20.         int nrNoduri;
  21.         fin >> nrNoduri;
  22.         ListaAdiac.resize(nrNoduri);
  23.  
  24.         for (int index = 0; index < nrNoduri; ++index)
  25.         {
  26.             int nrSucc;
  27.             fin >> nrSucc;
  28.             for (int index2 = 0; index2 < nrSucc; ++index2)
  29.             {
  30.                 int succ;
  31.                 fin >> succ;
  32.                 ListaAdiac[index].push_back(succ);
  33.             }
  34.         }
  35.  
  36.         fin.close();
  37.     }
  38.  
  39.     void afisareListe()
  40.     {
  41.         for (int index = 0; index < ListaAdiac.size(); ++index)
  42.         {
  43.             cout << "L[" << index << "]: ";
  44.             for (int index2 = 0; index2 < ListaAdiac[index].size(); ++index2)
  45.                 cout << ListaAdiac[index][index2] << ' ';
  46.             cout << endl;
  47.         }
  48.         cout << endl;
  49.     }
  50.  
  51.     template<typename T>
  52.     void atr(vector<T>& vect, int dim, int val)
  53.     {
  54.         for (int index = 0; index < dim; ++index)
  55.             vect[index] = val;
  56.     }
  57.  
  58.     vector<int> BFS(int start, int dest)
  59.     {
  60.         queue<int> coada;
  61.         vector<bool> viz;
  62.         vector<int> comp, dist;
  63.  
  64.         viz.resize(ListaAdiac.size());
  65.         atr(viz, viz.size(), 0);
  66.  
  67.         if (dest != -1)
  68.         {
  69.             dist.resize(ListaAdiac.size());
  70.             atr(dist, dist.size(), INT_MAX);
  71.             dist[start] = 0;
  72.         }
  73.         else
  74.             comp.push_back(start);
  75.  
  76.         viz[start] = 1;
  77.         coada.push(start);
  78.  
  79.         while (!coada.empty())
  80.         {
  81.             int cap = coada.front();
  82.             coada.pop();
  83.             for (int index = 0; index < ListaAdiac[cap].size(); index++)
  84.             {
  85.                 int succ = ListaAdiac[cap][index];
  86.                 if (viz[succ] == 0)
  87.                 {
  88.                     viz[succ] = 1;
  89.                     coada.push(succ);
  90.  
  91.                     if (dest != -1)
  92.                     {
  93.                         dist[succ] = dist[cap] + 1;
  94.                         if (succ == dest)
  95.                             return dist;
  96.                     }
  97.                     else
  98.                         comp.push_back(succ);
  99.                 }
  100.             }
  101.         }
  102.  
  103.         return comp;
  104.     }
  105.  
  106.     int distanta(int start, int dest)
  107.     {
  108.         vector<int> dist;
  109.         dist = BFS(start, dest);
  110.  
  111.         if (!dist.empty())
  112.             return dist[dest];
  113.  
  114.         return -1;
  115.     }
  116.  
  117.     int excentricitate(int nod)
  118.     {
  119.         int excNod = -1;
  120.  
  121.         for (int index = 0; index < ListaAdiac.size(); ++index)
  122.             if (nod != index && excNod < distanta(nod, index))
  123.                 excNod = distanta(nod, index);
  124.  
  125.         return excNod;
  126.     }
  127.  
  128.     void clear()
  129.     {
  130.         for (int index = 0; index < ListaAdiac.size(); ++index)
  131.         {
  132.             ListaAdiac[index].clear();
  133.             ListaAdiac[index].shrink_to_fit();
  134.         }
  135.         ListaAdiac.clear();
  136.         ListaAdiac.shrink_to_fit();
  137.     }
  138. };
  139.  
  140. int main()
  141. {
  142.     GRAF GN;
  143.     GN.citire("liste.in");
  144.  
  145.     cout << "Listele de adiacenta ale grafului neorientat: \n";
  146.     GN.afisareListe();
  147.  
  148.     if (GN.BFS(0, -1).size() == GN.ListaAdiac.size())
  149.     {
  150.         int diametru = INT_MIN, raza = INT_MAX;
  151.         for (int index = 0; index < GN.ListaAdiac.size(); ++index)
  152.         {
  153.             int excNod = GN.excentricitate(index);
  154.             cout << "Excentricitatea nodului " << index << " este: " << excNod << endl;
  155.  
  156.             if (excNod > diametru)
  157.                 diametru = excNod;
  158.             if (excNod < raza)
  159.                 raza = excNod;
  160.         }
  161.         if (diametru != INT_MIN && raza != INT_MAX)
  162.             cout << "\nDiametrul este " << diametru << " si raza este " << raza << endl;
  163.         else
  164.             cout << "Nu s-au putut afla diametrul si raza. \n";
  165.     }
  166.     else
  167.         cout << "Graful nu este conex. \n";
  168.  
  169.     GN.clear();
  170.     return 0;
  171. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement