Cod sursa(job #2245575)

Utilizator Ruxandra985Nanu Ruxandra Laura Ruxandra985 Data 25 septembrie 2018 15:57:33
Problema Cc Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.27 kb
#include <cstdio>
#include <deque>
#include <vector>
#include <bitset>
#define DIMN 205
#define INF 2000000000
using namespace std;

int dist[DIMN],tt[DIMN],n,s,d;
bitset <DIMN> f;
vector <int> v[DIMN];
deque <int> dq;
int c[DIMN][DIMN],cst[DIMN][DIMN],fl[DIMN][DIMN];

int bellmanford (){
    int i,nod,vecin;
    for (i=0;i<=2*n+1;i++){
        dist[i]=INF;
        tt[i]=-1;
    }
    f.reset();
    dq.push_back(s);
    dist[s]=0;
    f[s]=1;
    while (dq.size()){
        nod=dq.front();
       // printf ("%d ",nod);
        for (i=0;i<v[nod].size();i++){
            vecin=v[nod][i];
            if (c[nod][vecin]>fl[nod][vecin] && dist[nod]+cst[nod][vecin]<dist[vecin]){
                dist[vecin]=dist[nod]+cst[nod][vecin];
                tt[vecin]=nod;
                if (!f[vecin]) {// nu e in deque
                    f[vecin]=1;
                    dq.push_back(vecin);
                }
            }
        }
        f[nod]=0;
        dq.pop_front();
    }
    if (dist[d]==INF)
        return 0; /// nu se mai poate pune flux
    return 1;
}
int main()
{
    FILE *fin=fopen ("cc.in","r");
    FILE *fout=fopen ("cc.out","w");
    int i,j,x,nod,vecin,sol,mini;
    fscanf (fin,"%d",&n);
    for (i=1;i<=n;i++){
        for (j=n+1;j<=2*n;j++){
            fscanf (fin,"%d",&x);
            v[i].push_back(j);
            v[j].push_back(i);
            c[i][j]=1;
            cst[i][j]=x;
            cst[j][i]=-x;
        }
    }
    for (i=1;i<=n;i++){
        v[0].push_back(i);
        v[i].push_back(0);
        c[0][i]=1;
    }
    for (i=n+1;i<=2*n;i++){
        v[2*n+1].push_back(i);
        v[i].push_back(2*n+1);
        c[i][2*n+1]=1;
    }
    s=0;
    d=2*n+1;
    sol=0;
    while (bellmanford()){ /// cat timp mai introduc flux
        vecin=d;
        nod=tt[d];
        mini=INF;
        while (nod!=-1){
            mini=min(mini,c[nod][vecin]-fl[nod][vecin]);
            vecin=nod;
            nod=tt[nod];
        }
        vecin=d;
        nod=tt[d];
        while (nod!=-1){
            fl[nod][vecin]+=mini;
            fl[vecin][nod]-=mini;
            vecin=nod;
            nod=tt[nod];
        }
        sol+= dist[d]*mini;
    }
    fprintf (fout,"%d",sol);
    return 0;
}