Pagini recente » Cod sursa (job #2640193) | Cod sursa (job #2845270) | Cod sursa (job #1603309) | Cod sursa (job #2607017) | Cod sursa (job #180021)
Cod sursa(job #180021)
#include <cstdio>
#include <queue>
#define DIM 432
#define INF 0x3f3f3f3f
using namespace std;
int N, F, C[DIM][DIM], cost[DIM][DIM], D[DIM], tata[DIM], sel[DIM], sol, paz[DIM], npaz;
int BF(int S);
int main()
{
FILE *fin = fopen("paznici2.in", "r");
FILE *fout = fopen("paznici2.out", "w");
fscanf(fin, "%d", &N);
int x;
for (int i = 1; i <= N; i++)
for (int j = 1; j <= N; j++)
{
fscanf(fin, "%d", &x);
cost[i][N + j] = x;
cost[N + j][i] = -x;
C[i][N + j] = 1;
}
F = 2 * N + 1;
for (int i = 1; i <= N; i++)
C[0][i] = 1;
for (int i = N + 1; i < F; i++)
C[i][F] = 1;
//Flux
while (BF(0))
{
sol += D[F];
for (int i = F; i; i = tata[i])
{
C[tata[i]][i]--;
C[i][tata[i]]++;
}
}
fprintf(fout, "%d\n", sol);
//
for (int i = N + 1; i < F; i++)
{
BF(i);
npaz = 0;
for (int j = 1; j <= N; j++)
if (cost[i][j] == D[j]) paz[++npaz] = j;
fprintf(fout, "%d ", npaz);
for (int j = 1; j <= npaz; j++)
fprintf(fout, "%d ", paz[j]);
fprintf(fout, "\n");
}
fclose(fin);
fclose(fout);
return 0;
}
int BF(int S)
{
queue <int> Q;
memset(sel, 0, sizeof(sel));
memset(tata, 0, sizeof(tata));
for (int i = 0; i <= F; i++)
D[i] = INF;
Q.push(S);
D[S] = 0;
sel[S] = 1;
while (!Q.empty())
{
int i = Q.front();
Q.pop();
sel[i] = 0;
for (int j = 0; j <= F; j++)
if (C[i][j] && cost[i][j] + D[i] < D[j])
{
D[j] = cost[i][j] + D[i];
tata[j] = i;
if (!sel[j])
{
Q.push(j);
sel[j] = 1;
}
}
}
if (!tata[F]) return 0;
return 1;
}