Пример #1
0
        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);
        }
Пример #2
0
        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);
        }
Пример #3
0
        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);
        }
Пример #4
0
        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()));
        }