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);
                }
            }
        }
Esempio n. 2
0
 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);
 }
Esempio n. 3
0
 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);
 }
Esempio n. 4
0
        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);
        }
Esempio n. 5
0
        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);
        }
Esempio n. 6
0
 private List <GraphModule> GetOptimalInitiationSequence(GraphModule module)
 {
     return(GetOptimalInitiationSequence_ByLowestMinValue(module));
 }