Cod sursa(job #1517345)

Utilizator TibixbAndrei Tiberiu Tibixb Data 4 noiembrie 2015 09:14:13
Problema Cc Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.92 kb
#include<fstream>
#include<vector>
#include<bitset>
#include<deque>
# define inf 1000000000
using namespace std;
vector <int> L[203];
bitset <203> U;
deque <int> q;
int T[203], n, minim, cost, i, j, C[203][203], F[203][203], Z[203][203], D[203], nod, vecin;
ifstream in("cc.in");
ofstream out("cc.out");
int bf()
{
    for(i=0; i<=2*n+1; i++)
        D[i]=inf;
    D[0]=0;
    U.reset();
    U[0]=1;
    q.clear();
    q.push_back(0);
    while(!q.empty())
    {
        nod=*q.begin();
        for(int i=0; i<L[nod].size(); i++)
        {
            vecin=L[nod][i];
            if(C[nod][vecin]-F[nod][vecin]>0 && D[vecin]>D[nod]+Z[nod][vecin])
            {
                D[vecin]=D[nod]+Z[nod][vecin];
                T[vecin]=nod;
                if(U[vecin]==0)
                {
                    q.push_back(vecin);
                    U[vecin]=1;
                }
            }
        }
        q.pop_front();
        U[nod]=0;
    }
    if(D[2*n+1]!=inf)
        return 1;
    return 0;
}
int main()
{
    in>>n;
    for(i=1; i<=n; i++)
    {
        L[0].push_back(i);
        C[0][i]=1;
        for(j=n+1; j<=2*n; j++)
        {
            L[j].push_back(2*n+1);
            C[j][2*n+1]=1;
            in>>Z[i][j];
            L[i].push_back(j);
            C[i][j]=1;
            L[j].push_back(i);
            Z[j][i]=-Z[i][j];
        }
    }
    while(bf())
    {
        minim=inf;
        for(nod=2*n+1; nod!=0 && minim!=0; nod=T[nod])
        {
            minim=min(minim, C[T[nod]][nod]-F[T[nod]][nod]);
        }
        if(minim!=0)
        {
            for(nod=2*n+1; nod!=0; nod=T[nod])
            {
                cost+=minim*Z[T[nod]][nod];
                F[T[nod]][nod]+=minim;
                F[nod][T[nod]]-=minim;
            }
        }
    }
    //for(i=1; i<=2*n+1; i++)
        //sol+=D[i];
    //out<<sol;
    out<<cost;
    return 0;
}