Cod sursa(job #751490)

Utilizator PetcuIoanPetcu Ioan Vlad PetcuIoan Data 26 mai 2012 11:02:57
Problema Cc Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.71 kb
#include<stdio.h>
#include<assert.h>

#include<vector>
#include<queue>
#include<algorithm>

using namespace std;

const int knmax = 1023, ko9k = 900000001;
int verts, source, dest, dad[knmax], vis[knmax], cap[knmax][knmax], cost[knmax][knmax], f[knmax][knmax];
int sol;

void read(){
    assert(freopen("cc.in","r",stdin) != NULL);

    scanf("%d", &verts);
    source = 0;
    dest = verts * 2 + 1;

    for(int i = 1; i <= verts; ++i)
      for(int j = 1; j <= verts; ++j){
        int aux;
        scanf("%d", &aux);
        cost[i][j + verts] = aux;
        cap[i][j + verts] = 1;
        cap[source][i] = 1;
        cap[j + verts][dest] = 1;
      }

    verts = verts * 2 + 1;
}

void init(){
    for(int i = 1; i <= verts; ++i)
        vis[i] = ko9k;
    vis[source] = 0;
}

int blm(){
    init();

    int i, now;
    queue<int> q;
    q.push(source);

    while(!q.empty()){
        now = q.front();
        q.pop();

        for(i = 1; i <= verts; ++i)
            if(cap[now][i] > f[now][i] && vis[i] > vis[now] + cost[now][i]){
                q.push(i);
                vis[i] = vis[now] + cost[now][i];
                dad[i] = now;
            }
    }
    if(vis[dest] < ko9k)
        return 1;
    return 0;
}

void solve(){
    int i, c_flow;
    while(blm()){
        c_flow = ko9k;

        for(i = dest; i != source; i = dad[i])
            c_flow = min(c_flow, cap[dad[i]][i] - f[dad[i]][i]);

        for(i = dest; i != source; i = dad[i]){
            sol += c_flow * cost[dad[i]][i];
            f[dad[i]][i] += c_flow;
            f[i][dad[i]] -= c_flow;
        }
    }
}

void write(){
    assert(freopen("cc.out","w",stdout) != NULL);
    printf("%d",sol);
}

int main(){
    read();
    solve();
    write();
    return 0;
}