Cod sursa(job #3193594)

Utilizator mite666Mihai Terenti mite666 Data 14 ianuarie 2024 23:22:05
Problema Cc Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.63 kb
#include <stdio.h>
#include <memory.h>
#include <queue>

#define NMAX 256
#define INFI 0x3f3f3f3f

int cost[NMAX][NMAX];
int cap[NMAX][NMAX];
int n;
int res;
int source, sink;

void read()
{
    scanf("%d", &n);
    for(int i = 1; i <= n; ++i)
        for(int j = 1; j <= n; ++j)
        {
            scanf("%d", &cost[i][n + j]);
            cost[n + j][i] = -cost[i][n + j];
            ++cap[i][n + j];
        }
    source = 0;
    sink = 2 * n + 1;
    for(int i = 1; i <= n; ++i)
        cap[source][i] = cap[i + n][sink] = 1;
}

int bfs()
{
    std::queue<int> q;
    bool viz[NMAX];
    int d[NMAX], t[NMAX];
    int x;

    memset(d, INFI, sizeof(d));
    memset(viz, 0, sizeof(viz));
    d[source] = 0;
    q.push(source);
    t[source] = -1;
    while(!q.empty())
    {
        x = q.front();
        viz[x]=0;
        q.pop();

        for(int i = 0; i <= sink; ++i)
            if(cap[x][i])
                if(d[x] + cost[x][i] < d[i])
                {
                    d[i] = d[x] + cost[x][i];
                    t[i] = x;

                    if(!viz[i]) {
                        q.push(i);
                        viz[i] = 1;
                    }

                }
    }

    if(d[sink] == INFI)
        return 0;

    for(int i = sink; i != source; i = t[i])
        --cap[t[i]][i], ++cap[i][t[i]];

    return 1;
}

void solve()
{
    while(bfs());

    for(int i = 1; i <= n; ++i)
        for(int j = n+1; j < sink; ++j)
            if(!cap[i][j])
                res += cost[i][j];
}

int main()
{
    freopen("cc.in", "r", stdin);
    freopen("cc.out", "w", stdout);
    read();
    solve();
    printf("%d\n", res);
    return 0;
}