Cod sursa(job #578736)

Utilizator DraStiKDragos Oprica DraStiK Data 11 aprilie 2011 15:46:05
Problema Paznici2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.32 kb
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;

#define pb push_back

#define INF 0x3f3f3f3f
#define DIM 405

int cst[DIM][DIM],c[DIM][DIM],f[DIM][DIM];
int dst[DIM],t[DIM];
int N,SRC,DST,cost;
bool viz[DIM];

vector <int> g[DIM];
queue <int> q;

void read ()
{
    int i,j,x;

    scanf ("%d",&N);
    for (i=1; i<=N; ++i)
        for (j=1; j<=N; ++j)
        {
            scanf ("%d",&x);

            c[i][j+N]=1;
            g[i].pb (j+N);
            g[j+N].pb (i);
            cst[i][j+N]=x;
            cst[j+N][i]=-x;
        }
}

inline int bellman_ford (int SRC)
{
    vector <int> :: iterator it;
    int nod;

    memset (dst,INF,sizeof (dst));
    memset (viz,0,sizeof (viz));
    memset (t,-1,sizeof (t));
    dst[SRC]=0;

    for (q.push (SRC); !q.empty (); q.pop ())
    {
        nod=q.front (); viz[nod]=0;
        for (it=g[nod].begin (); it!=g[nod].end (); ++it)
            if (dst[nod]+cst[nod][*it]<dst[*it] && c[nod][*it]!=f[nod][*it])
            {
                dst[*it]=dst[nod]+cst[nod][*it];
                t[*it]=nod;

                if (!viz[*it])
                {
                    viz[*it]=1;
                    q.push (*it);
                }
            }
    }

    if (t[DST]==-1)
        return 0;

    return 1;
}

void solve ()
{
    int i;

    SRC=0; DST=(N<<1)+1;
    for (i=1; i<=N; ++i)
    {
        c[SRC][i]=1;
        g[SRC].pb (i);
        g[i].pb (SRC);

        c[i+N][DST]=1;
        g[i+N].pb (DST);
        g[DST].pb (i+N);
    }

    while (bellman_ford (SRC))
    {
        cost+=dst[DST];
        for (i=DST; i!=SRC; i=t[i])
        {
            ++f[t[i]][i];
            --f[i][t[i]];
        }
    }
}

void print ()
{
    int i,j,cnt;

    printf ("%d\n",cost);
    for (i=1; i<=N;++i)
    {
        bellman_ford (i+N);
        cnt=0;

        for (j=1; j<=N; ++j)
            if (!(dst[j]+cst[j][i+N]))
                ++cnt;

        printf ("%d ",cnt);
        for (j=1; j<=N; ++j)
            if (!(dst[j]+cst[j][i+N]))
                printf ("%d ",j);
        printf ("\n");
    }
}

int main ()
{
    freopen ("paznici2.in","r",stdin);
    freopen ("paznici2.out","w",stdout);

    read ();
    solve ();
    print ();

    return 0;
}