Pagini recente » Cod sursa (job #516457) | Cod sursa (job #890125) | Cod sursa (job #174365) | Cod sursa (job #972086) | Cod sursa (job #3189846)
#include <iostream>
#include <fstream>
#include <vector>
#include <climits>
using namespace std;
void initializeVectors(int n, vector<int>& u, vector<int>& v, vector<int>& p, vector<int>& way) {
fill(u.begin(), u.end(), 0);
fill(v.begin(), v.end(), 0);
fill(p.begin(), p.end(), 0);
fill(way.begin(), way.end(), 0);
}
int updateLabels(int n, const vector<vector<int>>& distanceMatrix, vector<int>& u, vector<int>& v, vector<int>& p, vector<int>& way, int i) {
vector<int> minv(n, INT_MAX);
vector<char> used(n, false);
p[0] = i;
int j0 = 0;
while (p[j0] != 0) {
int i0 = p[j0], delta = INT_MAX, j1;
used[j0] = true;
for (int j = 1; j < n; ++j) {
if (!used[j]) {
int cur = distanceMatrix[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;
}
return j0;
}
int findMinDistance(const vector<vector<int>>& distanceMatrix) {
int n = distanceMatrix.size();
vector<int> u(n), v(n), p(n), way(n);
initializeVectors(n, u, v, p, way);
for (int i = 1; i < n; ++i) {
int j0 = updateLabels(n, distanceMatrix, u, v, p, way, i);
do {
int j1 = way[j0];
p[j0] = p[j1];
j0 = j1;
} while (j0);
}
return -v[0];
}
int main() {
ifstream fin("input.txt");
ofstream fout("output.txt");
int N;
fin >> N;
vector<vector<int>> distanceMatrix(N + 1, vector<int>(N + 1));
for (int i = 1; i <= N; ++i) {
for (int j = 1; j <= N; ++j) {
fin >> distanceMatrix[i][j];
}
}
fout << findMinDistance(distanceMatrix) << endl;
fin.close();
fout.close();
return 0;
}