Cod sursa(job #346629)

Utilizator freak93Adrian Budau freak93 Data 8 septembrie 2009 19:30:59
Problema Cc Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.15 kb
#include<fstream>
#include<cstring>
#include<vector>
#include<queue>

using namespace std;

const char iname[]="cc.in";
const char oname[]="cc.out";
const int maxn=205;
const int INF=0x3f3f3f3f;

ifstream f(iname);
ofstream g(oname);

queue<int> Q;
vector<int> E[maxn];

int F[maxn][maxn],C[maxn][maxn],Cost[maxn][maxn],ok,n,m,i,from[maxn],dis[maxn],price,S,D,j;

bool been[maxn];

int BF()
{
    //initializam distantele si coada
    memset(dis,INF,sizeof(dis));
    memset(been,false,sizeof(been));
    dis[S]=0;
    been[S]=true;
    Q.push(S);

    //Bellman-Ford
    int x;
    while(!Q.empty())
    {
        x=Q.front();
        Q.pop();
        if(x==D)
            continue;
        been[x]=false;
        for(vector<int>::iterator it=E[x].begin();it!=E[x].end();++it)
            if(C[x][*it]-F[x][*it]>0&&dis[x]+Cost[x][*it]<dis[*it])
            {
                dis[*it]=dis[x]+Cost[x][*it];
                from[*it]=x;
                if(been[*it]==false)
                    been[*it]=true,Q.push(*it);
            }
    }

    //adaugam flux si dam cost

    if(dis[D]==INF)
        return -1;

    int mint=INF;
    for(int i=D;i!=S;i=from[i])
        mint=min(mint,C[from[i]][i]-F[from[i]][i]);

    for(int i=D;i!=S;i=from[i])
    {
        F[from[i]][i]+=mint;
        F[i][from[i]]-=mint;
    }

    return mint*dis[D];
}

int main()
{
    f>>n;
    for(i=1;i<=n;++i)
    {
        for(j=1;j<=n;++j)
        {
            f>>Cost[i][j+n];
            Cost[j+n][i]=-Cost[i][j+n];
            C[i][j+n]=INF;
            C[j+n][i]=0;
            E[i].push_back(j+n);
            E[j+n].push_back(i);
        }
    }

    S=0;
    for(i=1;i<=n;++i)
    {
        E[i].push_back(S);
        E[S].push_back(i);
        Cost[S][i]=Cost[i][S]=0;
        C[S][i]=1;
        C[i][S]=0;
    }

    D=2*n+1;
    for(i=2*n;i>n;--i)
    {
        E[i].push_back(D);
        E[D].push_back(i);
        Cost[i][D]=Cost[D][i]=0;
        C[i][D]=1;
        C[D][i]=0;
    }

    for(;(ok=BF())>=0;)
        price+=ok;

    g<<price<<"\n";

    f.close();
    g.close();

    return 0;
}