Pagini recente » Cod sursa (job #61578) | Cod sursa (job #2580957) | Cod sursa (job #787437) | Cod sursa (job #1425368) | Cod sursa (job #3190471)
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
ifstream fin("cc.in");
ofstream fout("cc.out");
const int INF = 1e9;
const int MAXN = 105;
int N;
int cost[MAXN][MAXN];
int lx[MAXN], ly[MAXN];
int matchX[MAXN], matchY[MAXN];
int slack[MAXN];
bool S[MAXN], T[MAXN];
vector<int> adj[MAXN];
bool hungarianDFS(int x) {
S[x] = true;
for (const auto &y : adj[x]) {
if (T[y]) continue;
if (lx[x] + ly[y] == cost[x][y]) {
T[y] = true;
if (!matchY[y] || hungarianDFS(matchY[y])) {
matchY[y] = x;
matchX[x] = y;
return true;
}
} else {
slack[y] = min(slack[y], lx[x] + ly[y] - cost[x][y]);
}
}
return false;
}
void updateLabels() {
int x, delta = INF;
for (x = 1; x <= N; ++x)
if (!T[x]) delta = min(delta, slack[x]);
for (x = 1; x <= N; ++x) {
if (S[x]) lx[x] -= delta;
if (T[x]) ly[x] += delta;
else slack[x] -= delta;
}
}
void hungarian() {
int x, y;
for (x = 1; x <= N; ++x) {
matchX[x] = matchY[x] = 0;
lx[x] = ly[x] = 0;
for (y = 1; y <= N; ++y) {
lx[x] = max(lx[x], cost[x][y]);
adj[x].push_back(y);
}
}
for (x = 1; x <= N; ++x) {
for (y = 1; y <= N; ++y) slack[y] = INF;
for (;;) {
for (y = 1; y <= N; ++y) S[y] = T[y] = 0;
if (hungarianDFS(x)) break;
else updateLabels();
}
}
}
int main() {
fin >> N;
for (int i = 1; i <= N; ++i)
for (int j = 1; j <= N; ++j)
fin >> cost[i][j];
hungarian();
int sum = 0;
for (int i = 1; i <= N; ++i)
sum += cost[i][matchX[i]];
fout << sum;
return 0;
}