Pagini recente » Cod sursa (job #2371993) | Borderou de evaluare (job #1343428) | Cod sursa (job #3272459) | Borderou de evaluare (job #409851) | Cod sursa (job #3186023)
#include <iostream>
#include <vector>
#include <algorithm>
#include <fstream>
using namespace std;
const int INF = 1e9;
int algoritmUngar(vector<vector<int>>& matriceCosturi) {
int N = matriceCosturi.size();
int M = matriceCosturi[0].size();
vector<int> u(N + 1, 0);
vector<int> v(M + 1, 0);
vector<int> p(M + 1, 0);
vector<int> drum(M + 1, 0);
for (int i = 1; i <= N; ++i) {
p[0] = i;
int j0 = 0;
vector<int> minv(M + 1, INF);
vector<char> folosit(M + 1, false);
do {
folosit[j0] = true;
int i0 = p[j0], delta = INF, j1;
for (int j = 1; j <= M; ++j) {
if (!folosit[j]) {
int cur = matriceCosturi[i0 - 1][j - 1] - u[i0] - v[j];
if (cur < minv[j]) {
minv[j] = cur;
drum[j] = j0;
}
if (minv[j] < delta) {
delta = minv[j];
j1 = j;
}
}
}
for (int j = 0; j <= M; ++j) {
if (folosit[j]) {
u[p[j]] += delta;
v[j] -= delta;
} else {
minv[j] -= delta;
}
}
j0 = j1;
} while (p[j0] != 0);
do {
int j1 = drum[j0];
p[j0] = p[j1];
j0 = j1;
} while (j0 != 0);
}
return -v[0];
}
int main() {
ifstream f("cc.in");
ofstream g("cc.out");
int N;
f >> N;
vector<vector<int>> distante(N, vector<int>(N));
for (int i = 0; i < N; ++i) {
for (int j = 0; j < N; ++j) {
f >> distante[i][j];
}
}
int distantaTotala = algoritmUngar(distante);
g << distantaTotala << endl;
return 0;
}