Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- int A[NMax][NMax]; // matrice adiacenta
- int c[NMax], n[2]; // in ce bipartitie este fiecare nod
- int q[NMax], in, sf; // coada pentru BFS
- int minPay(int N, int M, int a[], int b[], int s, int t) {
- for (int i = 1; i <= N; i++) { c[i] = -1; } // camera nepazita
- for (int i = 0; i < M; i++) {
- A[a[i]][b[i]] = 1;
- A[b[i]][a[i]] = 1;
- } // construiesc matricea de adiacenta
- int pay = 0; // plata totala
- for (int i = 1; i <= N; i++) if (c[i] == -1) { // camera nepazita
- n[0] = n[1] = 0; // paznici noi din fiecare tip (dimensiunea bipartitiilor componentei)
- q[in=sf=0] = i; // noul nod in coada
- c[i] = 1; n[c[i]]++;
- while (in <= sf) {
- int x = q[in++]; // extrag primul elemente
- for (int j = 1; j <= N; j++) { // orice nod
- if (A[x][j]) { // vecin
- if (c[j] == -1) { // nepazit
- c[j] = 1 - c[x]; // este alocat celeilalte companii
- n[c[j]]++; // numar dimensiunile bipartitiilor
- q[++sf] = j; // adaug in coada
- } else if (c[x] == c[j]) {
- return -1;
- // avem un circuit de lungime impara!
- } } } }
- // alegerea optima pentru componenta conexa curenta
- // sau min(s, p) va fi alocat catre max(n[0], n[1]) si invers
- if (s * n[0] + t * n[1] < s * n[1] + t * n[0]) {
- pay += s * n[0] + t * n[1];
- } else {
- pay += s * n[1] + t * n[0];
- } }
- return pay;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement