Cod sursa(job #902849)

Utilizator DaNutZ2UuUUBB Bora Dan DaNutZ2UuU Data 1 martie 2013 16:59:49
Problema Cc Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 kb
#include <fstream>
#define E 100001
#define N 202
using namespace std;
ifstream fin("cc.in"); ofstream fout("cc.out");
long e=0;
int k, i, j, n, v[N][N], c[N][N], f[N][N], w[E], u[N], g[N], p, q, t, l;
int main()
{
    fin >> n;
    for(i = 1; i <= n; i++)
        for(j = 1; j <= n; j++)
        {
            fin >> k;
            v[i][n + j + 1] = k, v[n + j + 1][i] = -k;
            c[i][n + j  + 1] = 1;
        }
    for(i = 1; i <= n; i++)
        c[0][i] = c[i + n + 1][n + 1] = 1, v[0][i] = v[i + n + 1][n + 1] = 0;

    while(1)
    {
        for(i = 1; i <= 2 * n + 1; i++)
                u[i] = 0, g[i] = E;
        g[0] = p = q =0, w[q++] = 0;
        while(p < q)
        {
            t = w[p++];
            if(t && t <=n)
            {
                for(i = n + 1; i <= 2 * n + 1; i++)
                    if(f[t][i] < c[t][i] && g[i] > g[t] + v[t][i])
                        w[q++] = i, u[i] = t, g[i] = g[t] + v[t][i];
            }
            else
                for(i = 1; i <= n + 1; i++)
                    if(f[t][i] < c[t][i] && g[i] > g[t] + v[t][i])
                        w[q++] = i, u[i] = t, g[i] = g[t] + v[t][i];
        }
    if(!u[n + 1])
        break;

    for(l = n + 1; l; l = u[l])
               f[u[l]][l]++, f[l][u[l]]--;
       e += g[n+1];
    }
    fout << e;

    fin.close(); fout.close();
    return 0;
}