Advertisement
KAMEN1973

Set Cover

Dec 18th, 2020
1,008
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 3.02 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5.  
  6. namespace SetCover
  7. {
  8.     class Program
  9.     {
  10.         static void Main(string[] args)
  11.         {
  12.             HashSet<int> universe = Console.ReadLine().Split(", ").Select(e => int.Parse(e)).ToHashSet();
  13.  
  14.             List<HashSet<int>> sets = new List<HashSet<int>>();
  15.  
  16.             while (true)
  17.             {
  18.                 string input = Console.ReadLine();
  19.                 if (string.IsNullOrEmpty(input))
  20.                 {
  21.                     break;
  22.                 }
  23.  
  24.                 HashSet<int> set = new HashSet<int>(input.Split(", ").Select(e => int.Parse(e)));
  25.                 sets.Add(set);
  26.             }
  27.  
  28.             HashSet<int> maxSet = sets.OrderByDescending(s => s.Count).FirstOrDefault();
  29.             //HashSet<int> targetUniverse = new HashSet<int>();
  30.             List<HashSet<int>> resultSets = new List<HashSet<int>>();
  31.  
  32.             resultSets.Add(maxSet);
  33.             sets.RemoveAt(0);
  34.  
  35.             if (!universe.SequenceEqual(resultSets[0]))
  36.             {
  37.  
  38.                 while (sets.Count > 0)
  39.                 {
  40.                     HashSet<int> targetUniverse = resultSets.SelectMany(s => s).ToHashSet();
  41.                     HashSet<int> greedySet = GetGreedySet(targetUniverse, sets);
  42.  
  43.                     if (!greedySet.All(e => resultSets.SelectMany(s => s).Contains(e)))
  44.                     {
  45.                         resultSets.Add(greedySet);
  46.  
  47.  
  48.                         int[] current = resultSets.SelectMany(s => s).Distinct().OrderBy(i => i).ToArray();
  49.                         if (universe.SequenceEqual(current))
  50.                         {
  51.                             break;
  52.                         }
  53.                     }
  54.  
  55.                     sets.Remove(greedySet);
  56.                 }
  57.  
  58.                 int[] resultSet = resultSets.SelectMany(s => s).Distinct().OrderBy(i => i).ToArray();
  59.                 if (!universe.SequenceEqual(resultSet))
  60.                 {
  61.                     Console.WriteLine("Error");
  62.                     return;
  63.                 }
  64.             }
  65.  
  66.             StringBuilder stringBuilder = new StringBuilder();
  67.  
  68.             stringBuilder.AppendLine($"Sets to take ({resultSets.Count}):");
  69.  
  70.             foreach (HashSet<int> set in resultSets)
  71.             {
  72.                 stringBuilder.AppendLine(string.Join(", ", set));
  73.             }
  74.  
  75.             Console.WriteLine(stringBuilder.ToString().TrimEnd());
  76.         }
  77.  
  78.         private static HashSet<int> GetGreedySet(HashSet<int> universe, List<HashSet<int>> sets)
  79.         {
  80.             HashSet<int> greedySet = sets[0];
  81.             sets.RemoveAt(0);
  82.  
  83.             foreach (HashSet<int> set in sets)
  84.             {
  85.                 HashSet<int> current = new HashSet<int>(set);
  86.                 current.ExceptWith(universe);
  87.                 if (current.Count > greedySet.Count)
  88.                 {
  89.                     greedySet = set;
  90.                 }
  91.             }
  92.  
  93.             return greedySet;
  94.         }
  95.     }
  96. }
  97.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement