internal CaseInput(List <string> lines) { this.lines = lines; N = int.Parse(lines[0]); var funs = lines[1].Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries).Select(int.Parse).ToArray(); var targets = lines[2].Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries).Select(int.Parse).ToArray(); for (int arrayIndex = 0; arrayIndex < N; arrayIndex++) { var targetGraphModule = targets[arrayIndex] > 0 ? Modules[targets[arrayIndex]] : null; var newGraphModule = new GraphModule { Id = arrayIndex + 1, Fun = funs[arrayIndex], Target = targetGraphModule }; targetGraphModule?.Triggers.Add(newGraphModule); Modules.Add(arrayIndex + 1, newGraphModule); } foreach (var module in Modules.Values) { if (module.Target == null) { AbyssalModules.Add(module); } if (!module.Triggers.Any()) { Initiators.Add(module); } } }
private long GetAndPopulateCheapestTriggerFunValues(GraphModule module) { if (!module.Triggers.Any()) { module.CheapestTriggerDuringCalculation = module.Fun; } else { var minAmongTriggers = module.Triggers.Select(trig => GetAndPopulateCheapestTriggerFunValues(trig)).Min(); module.CheapestTriggerDuringCalculation = Math.Max(module.Fun, minAmongTriggers); } return(module.CheapestTriggerDuringCalculation); }
private long GetAndPopulateMaxFunValues(GraphModule module) { if (!module.Triggers.Any()) { module.MaxAssociatedFunDuringCalculation = module.Fun; } else { var maxAmongTriggers = module.Triggers.Select(trig => GetAndPopulateMaxFunValues(trig)).Max(); module.MaxAssociatedFunDuringCalculation = Math.Max(module.Fun, maxAmongTriggers); } return(module.MaxAssociatedFunDuringCalculation); }
private long Trigger(GraphModule module, HashSet <GraphModule> triggeredModules, long funToDate) { var updatedFun = Math.Max(module.Fun, funToDate); triggeredModules.Add(module); if (triggeredModules.Contains(module.Target)) { return(updatedFun); } var finalFun = Trigger(module.Target, triggeredModules, updatedFun); return(finalFun); }
private List <GraphModule> GetOptimalInitiationSequence_ByLowestMaxValue(GraphModule module) { if (!module.Triggers.Any()) { return(new List <GraphModule> { module }); } var orderedTriggers = module.Triggers.OrderBy(trig => trig.MaxAssociatedFunDuringCalculation).ToList(); var result = new List <GraphModule>(); foreach (var trigger in orderedTriggers) { result.AddRange(GetOptimalInitiationSequence(trigger)); } return(result); }
private List <GraphModule> GetOptimalInitiationSequence(GraphModule module) { return(GetOptimalInitiationSequence_ByLowestMinValue(module)); }