Pagini recente » Cod sursa (job #1433938) | Cod sursa (job #2480955) | Cod sursa (job #2066716) | Istoria paginii runda/wellcodesimulareclasa10-11martie | Cod sursa (job #1207254)
#include <fstream>
#include <vector>
#include <queue>
#define DIMN 650
#define INF 2000000000
using namespace std;
ifstream f("cc.in");
ofstream g("cc.out");
int F[DIMN][DIMN], C[DIMN][DIMN], cost[DIMN][DIMN], D[DIMN], T[DIMN];
bool viz[DIMN];
bool ok;
int n, flow, x, y, c;
vector<int> L[DIMN];
int BF () {
queue<int> q;
for (int i=0; i<=n; ++i)
viz[i] = 0, D[i] = INF;
q.push(0);
D[0] = 0;
while (!q.empty()) {
int nod = q.front();
q.pop();
viz[nod] = 0;
for (vector<int>::iterator it=L[nod].begin(); it!=L[nod].end(); ++it)
if (D[*it] > D[nod] + cost[nod][*it] && C[nod][*it] - F[nod][*it] > 0) {
D[*it] = D[nod] + cost[nod][*it];
if (!viz[*it]) {
viz[*it] = 1;
q.push(*it);
}
T[*it] = nod;
}
}
if (D[n] != INF) {
ok = true;
int Min = INF;
for (int i=n; i!=0; i=T[i])
Min = min(Min, C[T[i]][i] - F[T[i]][i]);
flow += Min;
for (int i=n; i!=0; i=T[i]) {
F[T[i]][i] += Min;
F[i][T[i]] -= Min;
}
return Min*D[n];
}
return 0;
}
int main () {
f >> n;
for (int j=1; j<=n; ++j)
for (int i=n+1; i<=2*n; ++i) {
f >> c;
L[j].push_back(i);
L[i].push_back(j);
C[j][i] = 1;
cost[j][i] = c;
cost[i][j] = -c;
}
for (int i=1; i<=n; ++i) {
L[0].push_back(i);
L[i].push_back(0);
C[0][i] = 1;
}
for (int i=n+1; i<=2*n; ++i) {
L[2*n+1].push_back(i);
L[i].push_back(2*n+1);
C[i][2*n+1] = 1;
}
n = 2*n+1;
ok = true;
int ans = 0;
while (ok) {
ok = false;
ans += BF();
}
g << ans << "\n";
return 0;
}