using System; using System.Collections.Generic; using System.Linq; namespace ConsoleApp1 { class Program { static void Main(string[] args) { var log = new FrienshipRecord[] { new FrienshipRecord() { Time = 0, Member1 = "a", Member2 = "b" }, new FrienshipRecord() { Time = 1, Member1 = "c", Member2 = "d" }, new FrienshipRecord() { Time = 2, Member1 = "d", Member2 = "e" }, new FrienshipRecord() { Time = 3, Member1 = "f", Member2 = "e" }, new FrienshipRecord() { Time = 4, Member1 = "a", Member2 = "f" }, new FrienshipRecord() { Time = 5, Member1 = "c", Member2 = "a" }, }; var socialNetwork = new List<HashSet<string>>(); int totalMembersCount = 6; foreach (var record in log) { var group1 = socialNetwork.FirstOrDefault(g => g.Contains(record.Member1)); var group2 = socialNetwork.FirstOrDefault(g => g.Contains(record.Member2)); switch (group1 is null, group2 is null) { case (false, false) when group1 == group2: // do nothing break; case (false, false) when group1 != group2: MergeGroups(socialNetwork, group1, group2); break; case (false, true): group1.Add(record.Member2); break; case (true, false): group2.Add(record.Member1); break; case (true, true): socialNetwork.Add(new HashSet<string>() { record.Member1, record.Member2 }); break; } // If the social network contains only one group // and also the grop contains all the members if (socialNetwork.Count == 1 && socialNetwork[0].Count == totalMembersCount) { Console.WriteLine("All members were friends at " + record.Time); return; } } Console.WriteLine("Not all of the members are friends yet"); } private static void MergeGroups( List<HashSet<string>> socialNetwork, HashSet<string> group1, HashSet<string> group2) { if (group1.Count > group2.Count) { group1.UnionWith(group2); socialNetwork.Remove(group2); } else { group2.UnionWith(group1); socialNetwork.Remove(group1); } } } internal struct FrienshipRecord { internal int Time; internal string Member1; internal string Member2; } }