Cod sursa(job #518451)

Utilizator APOCALYPTODragos APOCALYPTO Data 31 decembrie 2010 21:18:34
Problema Cc Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.9 kb
// nu uita de smenul lui Puni

using namespace std;

#include<iostream>
#include<fstream>
#include<vector>
#include<queue>
#include<cstring>
#define pb push_back
#define oo 0x3f3f3f3f

struct nod
{
    int lg,c;
};
vector<nod> G[210];
ofstream fout("cc.out");

int intr[105][105];
int C[210][210],F[210][210],N,S,surs,D,sink;
int q[40010],isinq[210],ante[210],viz[210],d[210];

bool BFS()
{
    q[0]=0;
    memset(isinq,0,sizeof(isinq));
    memset(viz,0,sizeof(viz));
    memset(ante,0,sizeof(ante));
    int i;
    for(i=0;i<=sink;i++)
    {
        d[i]=oo;
    }
    d[surs]=0;
    q[++q[0]]=surs;
    isinq[surs]=1;
    viz[surs]=1;
    vector<nod>::iterator it;
    int u,front=1;
    while(front<=q[0])
    {
        u=q[front++];
        isinq[u]=0;
        for(it=G[u].begin();it<G[u].end();it++)
        {
            if(C[u][it->lg]>F[u][it->lg])
            {
                if(d[it->lg]>d[u]+it->c)
                {
                    d[it->lg]=it->c+d[u];
                    ante[it->lg]=u;
                    viz[it->lg]=1;
                    if(!isinq[it->lg])
                    {
                        isinq[it->lg]=1;
                        q[++q[0]]=it->lg;
                    }
                }
            }
        }
    }

    return viz[sink];

}

void solve()
{
    int flow=0;
    int fmin;
    int cmin;
    vector<nod>::iterator it;
    int i;

    for(flow=0;BFS();)
    {
        fmin=C[ante[sink]][sink]-F[ante[sink]][sink];

        for(i=ante[sink];i!=surs;i=ante[i])
        {
            fmin=min(fmin,C[ante[i]][i]-F[ante[i]][i]);

        }

        F[ante[sink]][sink]+=fmin;
        F[sink][ante[sink]]-=fmin;

        for(i=ante[sink];i!=surs;i=ante[i])
        {
            F[ante[i]][i]+=fmin;
            F[i][ante[i]]-=fmin;
        }
        cmin+=d[sink]*fmin;
        flow+=fmin;

    }
    //cout<<flow;
    //fout<<cmin<<"\n";
    int sum=0;
    for(i=1;i<=S;i++)
    {
        for(it=G[i].begin();it<G[i].end();it++)
        {
            if(F[i][it->lg]==1)
            {
                sum+=it->c;
            }
        }
    }
    fout<<sum<<"\n";
}

void cit()
{
    int i,ii;
    ifstream fin("cc.in");

    fin>>N;
    for(i=1;i<=N;i++)
    {
        for(ii=1;ii<=N;ii++)
        {
            fin>>intr[i][ii];
            C[i][ii+N]=1;
            G[i].pb((nod){ii+N,intr[i][ii]});
            G[ii+N].pb((nod){i,-intr[i][ii]});
        }
    }

    S=N;
    D=N;
    sink=1+N+N;
    surs=0;

    for(i=1;i<=S;i++)
    {
        C[0][i]=1;
        G[0].pb((nod){i,0});
        G[i].pb((nod){0,0});

    }

    for(i=1;i<=D;i++)
    {
        C[i+N][sink]=1;
        G[sink].pb((nod){i+N,0});
        G[i+N].pb((nod){sink,0});
    }


    fin.close();
}


int main()
{
    cit();

    solve();

    fout.close();

    return 0;

}