Advertisement
pauldiac

Untitled

Jul 13th, 2025
55
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.54 KB | None | 0 0
  1. int A[NMax][NMax]; // matrice adiacenta
  2. int c[NMax], n[2]; // in ce bipartitie este fiecare nod
  3. int q[NMax], in, sf; // coada pentru BFS
  4. int minPay(int N, int M, int a[], int b[], int s, int t) {
  5.     for (int i = 1; i <= N; i++) { c[i] = -1; } // camera nepazita
  6.     for (int i = 0; i < M; i++) {
  7.         A[a[i]][b[i]] = 1;
  8.         A[b[i]][a[i]] = 1;
  9.     } // construiesc matricea de adiacenta
  10.     int pay = 0; // plata totala
  11.     for (int i = 1; i <= N; i++) if (c[i] == -1) { // camera nepazita
  12.         n[0] = n[1] = 0; // paznici noi din fiecare tip (dimensiunea bipartitiilor componentei)
  13.         q[in=sf=0] = i; // noul nod in coada
  14.         c[i] = 1; n[c[i]]++;
  15.         while (in <= sf) {
  16.             int x = q[in++]; // extrag primul elemente
  17.             for (int j = 1; j <= N; j++) { // orice nod
  18.                 if (A[x][j]) { // vecin
  19.                     if (c[j] == -1) { // nepazit
  20.                         c[j] = 1 - c[x]; // este alocat celeilalte companii
  21.                         n[c[j]]++; // numar dimensiunile bipartitiilor
  22.                         q[++sf] = j; // adaug in coada
  23.                     } else if (c[x] == c[j]) {
  24.                         return -1;
  25.                         // avem un circuit de lungime impara!
  26.         }   }   }   }
  27.         // alegerea optima pentru componenta conexa curenta
  28.         // sau min(s, p) va fi alocat catre max(n[0], n[1]) si invers
  29.         if (s * n[0] + t * n[1] < s * n[1] + t * n[0]) {
  30.             pay += s * n[0] + t * n[1];
  31.         } else {
  32.             pay += s * n[1] + t * n[0];
  33.     }   }
  34.     return pay;
  35. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement