Pagini recente » Cod sursa (job #2875154) | Cod sursa (job #2495185) | Cod sursa (job #356812) | Cod sursa (job #2474413) | Cod sursa (job #319939)
Cod sursa(job #319939)
#include <cstdio>
#include <cstring>
const int MAX_N = 220;
const int INF = 0x3f3f3f3f;
int n, sol, fi, st, ch;
int c[MAX_N][MAX_N];
int f[MAX_N], up[MAX_N], q[MAX_N];
inline int min(int a, int b) { return (a < b) ? a : b; }
void bf()
{
memset(f, 0, sizeof(f));
memset(up, -1, sizeof(up));
f[st] = INF;
q[0] = st;
int l, r, i;
for (l = r = 0; l <= r; ++l)
{
int nod = q[l];
for (i = 1; i <= 2 * n + 2; ++i)
if (c[nod][i] && f[i] == 0)
{
f[i] = min(f[nod], c[nod][i]);
up[i] = nod;
q[++r] = i;
if (i == fi)
{
l = r + 1;
break;
}
}
}
printf("*%d\n", f[fi]);
ch = f[fi];
if (ch)
{
for (i = fi; i != st; i = up[i])
{
c[up[i]][i] -= f[fi];
c[i][up[i]] += f[fi];
}
}
}
int main()
{
int i, j, x, y;
freopen("harta.in", "r", stdin);
freopen("harta.out", "w", stdout);
st = 2 * n + 1;
fi = 2 * n + 2;
scanf("%d", &n);
for (i = 1; i <= n; ++i)
{
scanf("%d %d", &x, &y);
sol += x;
c[i + n][fi] = c[fi][i + n] = x;
c[st][i] = c[i][st] = y;
}
for (i = 1; i <= n; ++i)
for (j = 1; j <= n; ++j)
if (i != j) c[i][j + n] = 1;
ch = 1;
while (ch)
{
bf();
}
printf("%d\n", sol);
for (i = 1; i <= n; ++i)
for (j = 1; j <= n; ++j)
if (i != j && c[i][j + n] == 0)
printf("%d %d\n", i, j);
}