Pagini recente » Istoria paginii utilizator/uaic_elnazli_morosac_rares | Profil Opportunity | Profil Opportunity | Cod sursa (job #3191444) | Cod sursa (job #148949)
Cod sursa(job #148949)
#include <cstdio>
#include <cstring>
#define Nmax 405
int n;
int cost[Nmax][Nmax];
int c[Nmax][Nmax];
int Q[Nmax * Nmax];
int d[Nmax * Nmax];
int t[Nmax];
int v[Nmax];
int sol[Nmax];
void citire()
{
int i, j;
scanf("%d\n", &n);
for (i = 1; i <= n; ++i)
for (j = 1; j <= n; ++j)
{
scanf("%d", &cost[i][n + j]);
cost[n + j][i] = - cost[i][n + j];
}
}
int BF(int s)
{
int st = 0, dr = 1, nod, i;
memset(v, 0, sizeof(v));
memset(t, -1, sizeof(t));
memset(d, 0x3f, sizeof(d));
v[s] = 1;
Q[dr] = s;
d[s] = 0;
while (st < dr)
{
nod = Q[++st];
v[nod] = 0;
for (i = 0; i <= 2 * n + 1; ++i)
if (c[nod][i] && d[i] > d[nod] + cost[nod][i])
{
d[i] = d[nod] + cost[nod][i];
t[i] = nod;
if (!v[i])
{
Q[++dr] = i;
v[i] = 1;
}
}
}
return t[2 * n + 1] != -1;
}
void flux()
{
int nod, cnt = 0;;
while(BF(0))
{
cnt += d[2 * n + 1];
for (nod = 2 * n + 1; t[nod] != -1; nod = t[nod])
{
--c[t[nod]][nod];
++c[nod][t[nod]];
}
}
printf("%d\n", cnt);
}
void solve()
{
int i, j, ct;
for (i = 1; i <= n; ++i)
c[0][i] = c[i + n][2 * n + 1] = 1;
for (i = 1; i <= n; ++i)
for (j = 1; j <= n; ++j)
c[i][j + n] = 1;
flux();
for (i = 1; i <= n; ++i)
{
BF(i + n);
ct = 0;
for (j = 1; j <= n; ++j)
if (cost[j][i + n] + d[j] == 0)
sol[++ct] = j;
printf("%d ", ct);
for (j = 1; j <= ct; ++j)
printf("%d ", sol[j]);
printf("\n");
}
}
int main()
{
freopen("paznici2.in", "r", stdin);
freopen("paznici2.out", "w", stdout);
citire();
solve();
return 0;
}