Cod sursa(job #1659782)

Utilizator touristGennady Korotkevich tourist Data 22 martie 2016 16:39:36
Problema Cc Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.7 kb
#include <bits/stdc++.h>
#define Nmax 205
#define pb push_back
#define INF 1000000000

using namespace std;

int C[Nmax][Nmax],F[Nmax][Nmax],Cost[Nmax][Nmax],sol,dp[Nmax],prv[Nmax],viz[Nmax];
int S,D,n;
vector <int> L[Nmax];
queue <int> Q;

inline bool Bellman()
{
    for(int i=1;i<=D;++i) dp[i]=INF;
    Q.push(S); viz[S]=1;
    while(!Q.empty())
    {
        int nod=Q.front(); Q.pop();
        viz[nod]=0;
        for(auto it : L[nod])
            if(F[nod][it]<C[nod][it] && dp[it]>dp[nod]+Cost[nod][it])
            {
                dp[it]=dp[nod]+Cost[nod][it];
                prv[it]=nod;
                if(!viz[it])
                {
                    Q.push(it); viz[it]=1;
                }
            }
    }
    return (dp[D]!=INF);
}

inline void Flux()
{
    int sum,minflow,i;
    while(Bellman())
    {
        minflow=INF; sum=0;
        for(i=D;i!=S;i=prv[i])
        {
            minflow=min(minflow,C[prv[i]][i]-F[prv[i]][i]);
            sum+=Cost[prv[i]][i];
        }
        sol+=minflow*sum;
        for(i=D;i!=S;i=prv[i])
        {
            F[prv[i]][i]+=minflow;
            F[i][prv[i]]-=minflow;
        }
    }
}

int main()
{
    int i,j,x;
    ifstream cin("cc.in");
    ofstream cout("cc.out");
    cin>>n;
    S=0; D=2*n+1;
    for(i=1;i<=n;++i)
    {
        L[S].pb(i); L[i].pb(S);
        C[S][i]=1;
        L[i+n].pb(D); L[D].pb(i+n);
        C[i+n][D]=1;
    }
    for(i=1;i<=n;++i)
        for(j=1;j<=n;++j)
        {
            cin>>x;
            L[i].pb(j+n); L[j+n].pb(i);
            C[i][j+n]=1;
            Cost[i][j+n]=x; Cost[j+n][i]=-x;
        }
    Flux();
    cout<<sol<<"\n";
    return 0;
}