Cod sursa(job #223727)

Utilizator MariusMarius Stroe Marius Data 29 noiembrie 2008 10:57:42
Problema Cuplaj maxim in graf bipartit Scor Ascuns
Compilator cpp Status done
Runda Marime 1.4 kb
#include <cstdio>
using namespace std;

#define FOR(i, a, b)  for (int i = (a); i <= (b); ++ i)
#define Max(a, b)    ((a) > (b) ? (a) : (b))
#define MAXN  105
#define MAXM  20

const char iname[] = "cuplaj.in";
const char oname[] = "cuplaj.out";

int G[MAXN][MAXN], n, m;

int bst[2][1 << MAXM];

/* bst[i][s] = cuplajul maxim obtinut din cuplarea primelor i valori din L
               cu valorile reprezentate de bitii de 1 din starea s;
   bst[i][s] = Max { bst[i - 1][s],
                   { bst[i - 1][s - {j}] | j aparitine s si nu exista muchia (i, j) in E },
                   { bst[i - 1][s - {j}] + 1 | j apartine s si exista muchia (i, j) in E } }

   O adaptare a acestei recurente poate fi folosita pentru calcularea numarului de cuplaje maxime.
*/

void read_in(void)
{
    int cnt_edges;
    scanf("%d %d %d", &n, &m, &cnt_edges);
    for (; cnt_edges --; )
    {
        int x, y;
        scanf("%d %d", &x, &y);
        G[x][y] = 1;
    }
}

int main(void)
{
    freopen(iname, "r", stdin);
    read_in();

    FOR (i, 1, n) FOR (cntr, 1, (1 << m) - 1)
    {
        bst[i & 1][cntr] = bst[1 ^ (i & 1)][cntr];
        FOR (j, 0, m - 1) if ((cntr >> j) & 1)
            bst[i & 1][cntr] = Max(bst[i & 1][cntr], bst[1 ^ (i & 1)][cntr ^ (1 << j)] + G[i][j + 1]);
    }
    freopen(oname, "w", stdout);
    printf("%d\n", bst[n & 1][(1 << m) - 1]);
    return 0;
}