Pagini recente » Cod sursa (job #686639) | Cod sursa (job #2388190) | Cod sursa (job #2600060) | Cod sursa (job #724999) | Cod sursa (job #223701)
Cod sursa(job #223701)
#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][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;
}