Cod sursa(job #1267720)

Utilizator CostanMiriamCostan Miriam CostanMiriam Data 20 noiembrie 2014 10:03:51
Problema Cc Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.74 kb
#include <fstream>
#include <vector>
#include <queue>
#include <cstring>
#define inf (1<<29)

using namespace std;

ifstream fin ("cc.in");
ofstream fout ("cc.out");

vector <int> l[210];

queue <int> q;

int fr,sc,n,x,S,D,i,j,minim,sol;

int d[210],c[210][210],f[210][210],t[210],cost[210][210];

bool viz[210];

bool bf () {
    int nod;
    memset (t,0,sizeof(t));
    q.push(S);
    for (int i=1;i<=D;i++)
        d[i]=inf;
    while (q.size()) {
        nod=q.front();
        q.pop();
        viz[nod]=0;
        for (int i=0;i<l[nod].size();i++) {
            fr=l[nod][i]; sc=cost[nod][fr];
            if (c[nod][fr]>f[nod][fr] && d[fr]>d[nod]+sc) {
                d[fr]=d[nod]+sc;
                if (!viz[fr]){
                    viz[fr]=1;
                    q.push(fr);
                }
                t[fr]=nod;
            }
        }
    }
    return (d[D]!=inf);
}

int main () {

    fin>>n;

    for (i=1;i<=n;i++)
        for (j=1;j<=n;j++) {
            fin>>x;
            l[i].push_back(j+n);
            l[j+n].push_back(i);
            cost[i][j+n]=x;
            cost[j+n][i]=-x;
            c[i][j+n]=1;
        }

    for (i=1;i<=n;i++) {
        l[0].push_back(i);
        l[i].push_back(0);
        c[0][i]=1;
        l[i+n].push_back(2*n+1);
        l[2*n+1].push_back(i+n);
        c[i+n][2*n+1]=1;
    }
    D=2*n+1;
    S=0;
    while (bf()) {
        minim=inf;
        for (i=D;i!=S;i=t[i])
            if (c[t[i]][i]-f[t[i]][i]<minim)
                minim=c[t[i]][i]-f[t[i]][i];
        sol+=minim*d[D];
        for (i=D;i!=S;i=t[i]){
            f[t[i]][i]+=minim;
            f[i][t[i]]-=minim;
        }
    }

    fout<<sol<<"\n";

    return 0;
}