Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #define NMax 100
- #define MMax 1000
- using namespace std;
- int N = 8; // exemplul de la subpunctul b.
- int M = 7;
- int p = 10, s = 5;
- int a[MMax] = {2, 1, 4, 3, 1, 4, 1}, b[MMax] = {6, 3, 5, 6, 2, 8, 7};
- 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 p) {
- 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, t) va fi alocat catre max(n[0], n[1]) si invers
- if (s * n[0] + p * n[1] < s * n[1] + p * n[0]) {
- pay += s * n[0] + p * n[1];
- } else {
- pay += s * n[1] + p * n[0];
- }
- }
- return pay;
- }
- int main()
- {
- cout << minPay(N, M, a, b, s, p) << endl;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement