Advertisement
pauldiac

Untitled

Jul 13th, 2025 (edited)
60
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.92 KB | None | 0 0
  1. #include <iostream>
  2. #define NMax 100
  3. #define MMax 1000
  4.  
  5.  
  6. using namespace std;
  7.  
  8. int N = 8; // exemplul de la subpunctul b.
  9. int M = 7;
  10. int p = 10, s = 5;
  11. int a[MMax] = {2, 1, 4, 3, 1, 4, 1}, b[MMax] = {6, 3, 5, 6, 2, 8, 7};
  12.  
  13. int A[NMax][NMax]; // matrice adiacenta
  14. int c[NMax], n[2]; // in ce bipartitie este fiecare nod
  15. int q[NMax], in, sf; // coada pentru BFS
  16. int minPay(int N, int M, int a[], int b[], int s, int p) {
  17.     for (int i = 1; i <= N; i++) {
  18.         c[i] = -1; // camera nepazita
  19.     }
  20.     for (int i = 0; i < M; i++) {
  21.         A[a[i]][b[i]] = 1;
  22.         A[b[i]][a[i]] = 1;
  23.     } // construiesc matricea de adiacenta
  24.     int pay = 0; // plata totala
  25.     for (int i = 1; i <= N; i++) if (c[i] == -1) { // camera nepazita
  26.         n[0] = n[1] = 0; // paznici noi din fiecare tip (dimensiunea bipartitiilor componentei)
  27.         q[in=sf=0] = i; // noul nod in coada
  28.         c[i] = 1; n[c[i]]++;
  29.         while (in <= sf) {
  30.             int x = q[in++]; // extrag primul elemente
  31.             for (int j = 1; j <= N; j++) { // orice nod
  32.                 if (A[x][j]) { // vecin
  33.                     if (c[j] == -1) { // nepazit
  34.                         c[j] = 1 - c[x]; // este alocat celeilalte companii
  35.                         n[c[j]]++; // numar dimensiunile bipartitiilor
  36.                         q[++sf] = j; // adaug in coada
  37.                     } else if (c[x] == c[j]) {
  38.                         return -1;
  39.                         // avem un circuit de lungime impara!
  40.                     }
  41.                 }
  42.             }
  43.         }
  44.         // alegerea optima pentru componenta conexa curenta
  45.         // sau min(s, t) va fi alocat catre max(n[0], n[1]) si invers
  46.         if (s * n[0] + p * n[1] < s * n[1] + p * n[0]) {
  47.             pay += s * n[0] + p * n[1];
  48.         } else {
  49.             pay += s * n[1] + p * n[0];
  50.         }
  51.     }
  52.     return pay;
  53. }
  54.  
  55. int main()
  56. {
  57.     cout << minPay(N, M, a, b, s, p) << endl;
  58.     return 0;
  59. }
  60.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement