Cod sursa(job #2487001)

Utilizator Raresr14Rosca Rares Raresr14 Data 3 noiembrie 2019 19:12:30
Problema Cc Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.65 kb
#include <fstream>
#include <iostream>
#include <queue>
#include <vector>
#include <climits>
#define DIM 300
using namespace std;
ifstream fin("cc.in");
ofstream fout("cc.out");
int i,j,n,x,sol,ok,D[DIM],f[DIM],flux[DIM][DIM],c[DIM][DIM],z[DIM][DIM],dst,T[DIM];
vector<int> L[DIM];
queue<int> q;
int ford(){
    for(i=0;i<=2*n+1;i++){
        f[i]=0;
        D[i]=INT_MAX;
    }
    f[0]=1;
    D[0]=ok=0;
    q.push(0);
    while(!q.empty()){
        int nod=q.front();
        q.pop();
        f[nod]=0;
        for(int i=0;i<L[nod].size();i++){
            int vec=L[nod][i];
            if(D[vec]>D[nod]+z[nod][vec]&&c[nod][vec]>flux[nod][vec]){
                D[vec]=D[nod]+z[nod][vec];
                if(f[vec]==0){
                    f[vec]=1;
                    q.push(vec);

                    if(vec==dst)
                        ok=1;
                }
                 T[vec]=nod;
            }
        }
    }
    return ok;
}
int main(){
    fin>>n;
    for(i=1;i<=n;i++)
        for(j=1;j<=n;j++){
            fin>>x;
            L[i].push_back(n+j);
            L[n+j].push_back(i);
            c[i][n+j]=1;
            z[i][n+j]=x;
            z[n+j][i]=-x;
        }
    dst=2*n+1;
    for(i=1;i<=n;i++){
        L[0].push_back(i);
        c[0][i]=1;
        L[i].push_back(0);
        L[dst].push_back(n+i);
        L[n+i].push_back(dst);
        c[n+i][dst]=1;
    }
    while(ford()){
        int nod=dst;
        while(nod!=0){
            flux[T[nod]][nod]++;
            flux[nod][T[nod]]--;
            nod=T[nod];
        }
        sol+=D[dst];
    }
    fout<<sol;
    return 0;
}