public void Returns_The_Lowest_Costs_With_Positive_Costs_Matrix() { var costMatrix = new int[, ] { { 5, 2, 3, 9 }, { 6, 4, 5, 2 }, { 3, 7, 2, 6 }, { 10, 1, 4, 5 } }; var result = HungarianMatching.GetAssignmentsWithMinimunCost(costMatrix); CollectionAssert.AreEqual(new int[] { 2, 3, 0, 1 }, result); }
public void GetAssignmentsWithMinimunCost_Get_JobAssignment_Array_To_Get_MinimumCost() { var costMartrix = new int[, ] { { 9, 2, 7, 8 }, { 6, 4, 3, 7 }, { 5, 8, 1, 8 }, { 7, 6, 9, 4 } }; var jobAssignments = HungarianMatching.GetAssignmentsWithMinimunCost(costMartrix); CollectionAssert.AreEqual(new int[] { 1, 0, 2, 3 }, jobAssignments); }
public void Returns_The_Lowest_Costs_With_Negative_Costs_Matrix2() { var costMatrix = new int[, ] { { 1, 0, 0 }, { 0, 0, 0 }, { 0, 1, 0 } }; var maxCostMatrix = MatrixHelper.GetMaxMatrixForHungarianMatching(costMatrix, 1); var result = HungarianMatching.GetAssignmentsWithMinimunCost(maxCostMatrix); CollectionAssert.AreEqual(new int[] { 0, 2, 1 }, result); }
public void Returns_The_Lowest_Costs_With_Negative_Costs_Matrix1() { var costMatrix = new int[, ] { { 5, 2, 3, 9 }, { 6, 4, 5, 2 }, { 3, 7, 2, 6 }, { 10, 1, 4, 5 } }; var maxCostMatrix = MatrixHelper.GetMaxMatrixForHungarianMatching(costMatrix, 10); var result = HungarianMatching.GetAssignmentsWithMinimunCost(maxCostMatrix); CollectionAssert.AreEqual(new int[] { 3, 2, 1, 0 }, result); }
public static void Solve() { for (int i = 0; i < n; i++) { if (ns[i] == 0) { t0.Add(i); } else { t1.Add(i); } } friends = Enumerable.Range(0, n).Select(s => new HashSet <int>()).ToArray(); foreach (var item in relations) { friends[item[0] - 1].Add(item[1] - 1); friends[item[1] - 1].Add(item[0] - 1); } int h = t0.Count; int w = t1.Count; int nn = Math.Max(h, w); var matrix = new int[nn, nn]; int max = 0; for (int i = 0; i < nn; i++) { for (int j = 0; j < nn; j++) { if (i >= h || j >= w || friends[t0[i]].Contains(t1[j])) { matrix[i, j] = 0; } else { int common = friends[t0[i]].Intersect(friends[t1[j]]).Count(); matrix[i, j] = common; max = Math.Max(max, common); } } } var maxCostMatrix = MatrixHelper.GetMaxMatrixForHungarianMatching(matrix, max); var matches = HungarianMatching.GetAssignmentsWithMinimunCost(maxCostMatrix); List <string> res = new List <string>(); for (int i = 0; i < nn; i++) { int j = matches[i]; if (i < h && j < w) { int a = t0[i]; int b = t1[j]; if (matrix[i, j] != 0) { res.Add((a + 1) + " " + (b + 1)); } } } Console.WriteLine(string.Join(",", res.ToArray())); }