Cod sursa(job #592914)

Utilizator GavrilaVladGavrila Vlad GavrilaVlad Data 31 mai 2011 12:48:03
Problema Cc Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.85 kb
#include <cstdio>
#include <cstring>
#include <vector>

using namespace std;

#define maxn 210
#define inf 1000000000

int n, i, j, k, ok, sol;
int c[maxn][maxn], f[maxn][maxn];
int q[maxn], fol[maxn], dist[maxn], t[maxn];
vector<int> v[maxn], cs[maxn];

void add(int a, int b, int cap, int cost)
{
    c[a][b]=cap;
    v[a].push_back(b);
    v[b].push_back(a);
    cs[a].push_back(cost);
    cs[b].push_back(-cost);
}

int bf()
{
    int nod, fiu, r=1, flux=inf;

    memset(t, 0, sizeof(t));
    memset(fol, 0, sizeof(fol));
    for(int i=1; i<=2*n+2; ++i)
        dist[i]=inf;
    dist[1]=0;
    q[1]=1;
    fol[1]=1;

    for(int i=1; i<=r; ++i)
    {
        nod=q[i%maxn];
        fol[nod]=0;
        for(int j=0; j<v[nod].size(); ++j)
        {
            fiu=v[nod][j];
            if(c[nod][fiu]-f[nod][fiu]>0 && dist[nod]+cs[nod][j]<dist[fiu])
            {
                dist[fiu]=dist[nod]+cs[nod][j];
                t[fiu]=nod;
                if(fol[fiu]==0)
                {
                    fol[fiu]=1;
                    q[(++r)%maxn]=fiu;
                }
            }
        }
    }

    if(dist[2*n+2]==inf)
        return 0;

    ok=1;

    nod=2*n+2;
    while(t[nod]!=0)
    {
        flux=min(flux, c[t[nod]][nod]-f[t[nod]][nod]);
        nod=t[nod];
    }

    nod=2*n+2;
    while(t[nod]!=0)
    {
        f[t[nod]][nod]+=flux;
        f[nod][t[nod]]-=flux;
        nod=t[nod];
    }

    return flux*dist[2*n+2];
}






int main()
{
    freopen("cc.in", "r", stdin);
    freopen("cc.out", "w", stdout);
    scanf("%d", &n);
    for(int i=1; i<=n; ++i)
    {
        add(1, i+1, 1, 0);
        add(1+n+i, 2*n+2, 1, 0);
        for(int j=1; j<=n; ++j)
        {
            scanf("%d", &k);
            add(i+1, n+j+1, 1, k);
        }
    }

    ok=1;
    while(ok)
    {
        ok=0;
        sol+=bf();
    }

    printf("%d\n", sol);
    return 0;
}