Cod sursa(job #2798625)

Utilizator LicaMihaiIonutLica Mihai- Ionut LicaMihaiIonut Data 11 noiembrie 2021 17:12:55
Problema Cc Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.65 kb
#include <bits/stdc++.h>
#include<fstream>
using namespace std;

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

const int nmax = 1e2;
int n;
int source, sink;
int rez[2 * nmax + 2][2 * nmax + 2];
int cost[2 * nmax + 2][2 * nmax + 2];

int par[2 * nmax + 2], dist[2 * nmax + 2];

long long ans;

bool inQ[2 * nmax + 2];

bool bellmanFord(){
    fill(par, par + sink + 1, -1);
    fill(dist, dist + sink + 1, 2e9);
    dist[source] = 0;
    queue <int> q;
    q.push(source);
    inQ[source] = true;

    while(!q.empty()){
        int elem = q.front(); q.pop();
        inQ[elem] = false;
        for(int i = sink; i >= source; i--)
            if(rez[elem][i] != 0)
                if(dist[elem] + cost[elem][i] < dist[i]){
                    dist[i] = dist[elem] + cost[elem][i];
                    par[i] = elem;
                    if(inQ[i] == false)
                        inQ[i] = true, q.push(i);
                }
    }

    if(par[sink] == -1)
        return false;
    int nUp = par[sink], nDown = sink;
    while(nDown != source){
        rez[nUp][nDown] = 0;
        rez[nDown][nUp] = 1;
        nDown = nUp;
        nUp = par[nUp];
    }
    ans += dist[sink];
    return true;
}

int main()
{
    in >> n;
    for(int i = 1; i <= n; i++)
        for(int j = n + 1; j <= 2 * n; j++){
            int x;
            in >> x;
            rez[i][j] = 1;
            cost[i][j] = x;
            cost[j][i] = -x;
        }
    source = 0, sink = 2 * n + 1;
    for(int i = 1; i <= n; i++)
        rez[source][i] = 1, rez[i + n][sink] = 1;

    while(bellmanFord());

    out << ans << "\n";

    return 0;
}