Cod sursa(job #2680094)

Utilizator bem.andreiIceman bem.andrei Data 2 decembrie 2020 17:19:18
Problema Cc Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.43 kb
#include <bits/stdc++.h>

using namespace std;
ifstream r("cc.in");
ofstream w("cc.out");
int n, f[256][256], a[256][256], dist[256], parent[256];
int bf()
{
    memset(parent, -1, sizeof(parent));
    memset(dist, 0x3f3f3f3f, sizeof(dist));
    dist[0]=0;
    parent[0]=0;
    int ok=1;
    while(ok==1)
    {
        ok=0;
        for(int i=0; i<=2*n+1; i++)
        {
            for(int j=0; j<=2*n+1; j++)
            {
                if( f[i][j]>0 && dist[j] > dist[i]+ a[i][j])
                {
                    dist[j]=dist[i] + a[i][j];
                    parent[j]=i;
                    ok=1;
                }
            }
        }
    }
    if( parent[2*n+1] ==-1){
        return 0;
    }
    return 1;
}
void flux()
{
    for(int i=1; i<=n; i++){
        f[0][i]=f[n+i][2*n+1]=1;
    }
    while(bf())
    {
        int p= 2*n+1;
        while(p)
        {
            f[parent[p]][p]--;
            f[p][parent[p]]++;
            p=parent[p];
        }
    }
    int sum=0;
    for(int i=1; i<=n; i++){
        for(int j=n+1; j<=2*n; j++){
            if(f[i][j]==0){
                sum+= a[i][j];
            }
        }
    }
    w<<sum<<"\n";
}
int main()
{
    r>>n;
    for(int i=1; i<=n; i++){
        for(int j=1; j<=n; j++)
        {
            r>>a[i][j+n];
            a[j+n][i]=-a[i][j+n];
            f[i][j+n]=1;
        }
    }
    flux();
    return 0;
}