Exemplo n.º 1
0
        public static void Part1()
        {
            AdjacencyGraph <ProgramNode, Edge <ProgramNode> > adjacencyGraph = GetAdjacencyGraph();
            var alg = new QuickGraph.Algorithms.TopologicalSort.TopologicalSortAlgorithm <ProgramNode, Edge <ProgramNode> >(adjacencyGraph);

            alg.Compute();
            ProgramNode root = alg.SortedVertices[0];

            Console.WriteLine($"Root program node is {root.Name}");
        }
Exemplo n.º 2
0
        public static void Part2()
        {
            AdjacencyGraph <ProgramNode, Edge <ProgramNode> > adjacencyGraph = GetAdjacencyGraph();
            var sortAlg = new QuickGraph.Algorithms.TopologicalSort.TopologicalSortAlgorithm <ProgramNode, Edge <ProgramNode> >(adjacencyGraph);

            sortAlg.Compute();
            ProgramNode root = sortAlg.SortedVertices[0];

            Console.WriteLine($"Root program node is {root.Name}");

            //var node = adjacencyGraph.Vertices.Where(v => v.Name == "exrud").Single();
            //node.Weight = 171;

            var alg           = new QuickGraph.Algorithms.Search.DepthFirstSearchAlgorithm <ProgramNode, Edge <ProgramNode> >(adjacencyGraph);
            int currentWeight = 0;

            alg.DiscoverVertex += (v) => { currentWeight += v.Weight; };
            alg.TreeEdge       += (te) => { te.Target.Parent = te.Source; };

            alg.FinishVertex += (v) => {
                if (v.Name != root.Name)
                {
                    v.Parent.ChildrenWeight += (v.Weight + v.ChildrenWeight);
                }
                int childNodes = adjacencyGraph.Edges.Where(e => e.Source == v).Count();
                if (childNodes != 0)
                {
                    var groupedEdges = adjacencyGraph.Edges.Where(e => e.Source == v).GroupBy(e => e.Target.Weight + e.Target.ChildrenWeight);
                    v.Unbalanced = groupedEdges.Count() > 1;
                    if (v.Unbalanced)
                    {
                        Console.WriteLine($"Unbalanced node {v.Name} has {childNodes} children");
                        foreach (var group in groupedEdges)
                        {
                            foreach (var n in group)
                            {
                                Console.WriteLine($"group ({group.Count()}): ({n.Target.Name}) {n.Target.Weight} + {n.Target.ChildrenWeight} = {n.Target.Weight + n.Target.ChildrenWeight}");
                            }
                        }
                    }
                }
            };
            alg.Compute(root);

            List <ProgramNode> unbalancedNode = alg.VisitedGraph.Vertices.Where(v => v.Unbalanced == true).ToList();
        }