Cod sursa(job #2899135)

Utilizator Tudor06MusatTudor Tudor06 Data 8 mai 2022 00:08:28
Problema Cc Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.67 kb
#include <bits/stdc++.h>

using namespace std;

const int NMAX = 200;

vector <int> edges[NMAX + 2];

int cost[NMAX + 2][NMAX + 2];
int flux[NMAX + 2][NMAX + 2];
int dist[NMAX + 1];

int p[NMAX + 1];

int s, d, n;

bool dijkstra() {
    for ( int i = 0; i <= d; i ++ ) {
        dist[i] = 0;
        p[i] = -2;
    }
    p[s] = -1;
    priority_queue <pair<int, int>> pq;
    pq.push( { 0, s } );
    while ( !pq.empty() && p[d] == -2 ) {
        int node = pq.top().second;
        pq.pop();
        for ( auto it : edges[node] ) {
            if ( flux[node][it] && p[it] == -2 ) {
                dist[it] = dist[node] + cost[node][it];
                p[it] = node;
                pq.push( { -dist[it], it } );
            }
        }
    }
    return ( p[d] != -2 );
}
int pump() {
    int c = 0;
    for ( int i = d; i != s; i = p[i] ) {
        c += cost[p[i]][i];
        flux[p[i]][i] --;
        flux[i][p[i]] ++;
    }
    return c;
}
int main() {
    ifstream fin( "cc.in" );
    ofstream fout( "cc.out" );
    int n;
    fin >> n;
    s = 0;
    d = 2 * n + 1;
    for ( int i = 1; i <= n; i ++ ) {
        for ( int j = n + 1; j <= 2 * n; j ++ ) {
            edges[i].push_back( j );
            edges[j].push_back( i );
            flux[i][j] = 1;
            fin >> cost[i][j];
            cost[j][i] = -cost[i][j];
        }
    }
    for ( int i = 1; i <= n; i ++ ) {
        edges[s].push_back( i );
        edges[i + n].push_back( d );
        flux[s][i] = 1;
        flux[i + n][d] = 1;
    }
    int mincost = 0;
    while ( dijkstra() ) {
        mincost += pump();
    }
    fout << mincost;
    return 0;
}