3double HungarianAlgorithm::Solve(
const std::vector<std::vector<double>> &DistMatrix, std::vector<int> &Assignment) {
4 int n =
static_cast<int>(DistMatrix.size());
9 int m =
static_cast<int>(DistMatrix[0].size());
10 int dim = std::max(n, m);
13 std::vector<std::vector<double>> a(dim, std::vector<double>(dim, (std::numeric_limits<double>::max)()));
14 for (
int i = 0; i < n; ++i) {
15 for (
int j = 0; j < m; ++j) {
16 double v = DistMatrix[i][j];
17 a[i][j] = std::isfinite(v) ? v : ((std::numeric_limits<double>::max)() * 0.5);
22 std::vector<double> u(dim + 1, 0.0), v2(dim + 1, 0.0);
23 std::vector<int> p(dim + 1, 0), way(dim + 1, 0);
26 for (
int i = 1; i <= dim; ++i) {
29 std::vector<double> minv(dim + 1, (std::numeric_limits<double>::max)());
30 std::vector<bool> used(dim + 1,
false);
34 int i0 = p[j0], j1 = 0;
35 double delta = (std::numeric_limits<double>::max)();
38 for (
int j = 1; j <= dim; ++j) {
41 double cur = a[i0 - 1][j - 1] - u[i0] - v2[j];
46 if (minv[j] < delta) {
53 for (
int j = 0; j <= dim; ++j) {
74 Assignment.assign(n, -1);
75 for (
int j = 1; j <= dim; ++j) {
76 if (p[j] <= n && j <= m) {
77 Assignment[p[j] - 1] = j - 1;
83 for (
int i = 0; i < n; ++i) {
84 int j = Assignment[i];
85 if (j >= 0 && j < m) {
86 cost += DistMatrix[i][j];