Advertisement
monyca98

Bucuresti iulie2016

Feb 28th, 2017
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.92 KB | None | 0 0
  1. #include<iostream>
  2. using namespace std;
  3.  
  4. void citire(int relatii[][50], int &n, int &k)
  5. {
  6.     int m;
  7.     cout << "n,m,k: ";
  8.     cin >> n >> m >> k;
  9.  
  10.     cout << m << " relatii: ";
  11.  
  12.     for (int r = 1; r <= m; r++)
  13.     {
  14.         int i, j;
  15.         cin >> i >> j;
  16.         relatii[i][j] = 1;
  17.         relatii[j][i] = 1;
  18.     }
  19. }
  20.  
  21. int numaraPrieteni(int line[], int n)
  22. {
  23.     int count = 0;
  24.     for (int i = 1; i <= n; i++)
  25.         if (line[i] == 1)
  26.             count++;
  27.  
  28.     return count;
  29. }
  30. void functionA(int relatii[][50], int n)
  31. {
  32.     for (int i = 1; i <= n; i++)
  33.         cout << numaraPrieteni(relatii[i], n) << " ";
  34.     cout << endl;
  35. }
  36.  
  37. void elimina(int sir[], int &lenSir, int index)
  38. {
  39.     for (int i = index; i < lenSir - 1; i++)
  40.         sir[i] = sir[i + 1];
  41.  
  42.     lenSir--;
  43. }
  44. void functionB(int relatii[][50], int n, int k, int rezultat[], int &lenRezultat)
  45. {
  46.     lenRezultat = 0;
  47.     int count[50]{ 0 };
  48.  
  49.     // initializam sirul rezultat cu toti utilizatorii si memoram cu ajutorul sirului 'count' numarul de prieteni al fiecarui utilizator
  50.     for (int i = 1; i <= n; i++)
  51.     {
  52.         rezultat[lenRezultat++] = i;
  53.         int nrP = numaraPrieteni(relatii[i], n);
  54.         count[i] = nrP;
  55.     }
  56.  
  57.     bool finished;
  58.  
  59.     // eliminam utilizatori din multimea rezultat pana cand ramanem cu mai putin de k utilizatori sau toti utilizatorii din rezultat respecta conditia din problema
  60.     do
  61.     {
  62.         finished = true;
  63.  
  64.         int i = 0;
  65.         while (i < lenRezultat) // parcurgem toti utilizatorii din submultimea rezultat
  66.         {
  67.             if (count[rezultat[i]] < k) // daca un utilizator are un numar de prieteni < k | rezultat[i] = utilizatorul de pe pozitia i din rezultat
  68.             {
  69.                 for (int j = 1; j < n; j++) // decrementam numarul de prieteni memorat in count la toti prietenii utilizatorului de pe pozitia i din rezultat
  70.                     if (relatii[rezultat[i]][j] == 1)
  71.                         count[j]--;
  72.  
  73.                 elimina(rezultat, lenRezultat, i);  // eliminam prietenul de pe pozitia i din rezultat
  74.                 i--;    // decrementam i-ul din moment ce am eliminat utilizatorul de pe pozitia i (deci toti utilizatorii de la i+1 la final s-au mutat cu o pozitie mai in stanga) si vom sari peste un utilizator daca nu facem asta
  75.                 finished = false;   // din moment ce am gasit un utilizator care n-a respectat conditia problemei in timpul parcurgerii curente, nu putem fii siguri ca sirul rezultat va contine doar utilizatori valizi la finalul acestei parcurgeri
  76.             }
  77.             i++;    // next utilizator
  78.         }
  79.  
  80.         if (lenRezultat < k)    // daca in sirul rezultat avem mai putini utilizatori decat k atunci ne oprim
  81.             finished = true;
  82.  
  83.     } while (!finished);
  84. }
  85.  
  86. void afisare(int rezultat[], int lenRezultat, int k)
  87. {
  88.     if (lenRezultat < k)
  89.         cout << "NU";
  90.     else
  91.         for (int i = 0; i < lenRezultat; i++)
  92.             cout << rezultat[i] << " ";
  93. }
  94. int main()
  95. {
  96.     int relatii[50][50]{ 0 }, n, k, rezultat[50], lenRezultat;
  97.  
  98.     citire(relatii, n, k);
  99.     functionA(relatii, n);
  100.     functionB(relatii, n, k, rezultat, lenRezultat);
  101.     afisare(rezultat, lenRezultat, k);
  102.  
  103.     cout << endl << endl;
  104.     system("pause");
  105.  
  106.     return 0;
  107. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement