Pagini recente » Cod sursa (job #2904472) | Cod sursa (job #2562289) | Cod sursa (job #1096983) | Cod sursa (job #2803350) | Cod sursa (job #2899135)
#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;
}