Pagini recente » Profil Darius1414 | Borderou de evaluare (job #3067081) | Monitorul de evaluare | Borderou de evaluare (job #3017178) | Cod sursa (job #3359512)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("cc.in");
ofstream fout("cc.out");
int n;
int a[105][105];
int u[105], v[105], p[105], way[105];
int main() {
fin >> n;
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= n; ++j)
fin >> a[i][j];
}
for (int i = 1; i <= n; ++i) {
p[0] = i;
int j0 = 0;
vector<int> minv(n + 1, 2e9);
vector<int> used(n + 1, 0);
do {
used[j0] = 1;
int i0 = p[j0];
int delta = 2e9;
int j1 = 0;
for (int j = 1; j <= n; ++j) {
if (!used[j]) {
int cur = a[i0][j] - u[i0] - v[j];
if (cur < minv[j]) {
minv[j] = cur;
way[j] = j0;
}
if (minv[j] < delta) {
delta = minv[j];
j1 = j;
}
}
}
for (int j = 0; j <= n; ++j) {
if (used[j]) {
u[p[j]] += delta;
v[j] -= delta;
} else {
minv[j] -= delta;
}
}
j0 = j1;
} while (p[j0]);
do {
int j1 = way[j0];
p[j0] = p[j1];
j0 = j1;
} while (j0);
}
fout << -v[0] << "\n";
return 0;
}