Pagini recente » Cod sursa (job #1491367) | Cod sursa (job #1085615) | Cod sursa (job #392435) | Cod sursa (job #717148) | Cod sursa (job #2795755)
#include <bits/stdc++.h>
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;
}