Cod sursa(job #1077875)

Utilizator sleepaholicNeculaescu Theodor sleepaholic Data 11 ianuarie 2014 18:58:00
Problema Paznici2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.07 kb
#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;
}