Пример #1
0
    private static long Count(RootedTreeNode node, int k)
    {
        long avail = k;

        if (node.Children.Length == 0)
        {
            return(1);
        }
        if (node.Parent != null)
        {
            avail -= node.Parent.Node.Degree;
        }
        if (avail <= 0)
        {
            return(0);
        }
        long prod = 1;

        for (int i = 0; i < node.Children.Length; i++)
        {
            prod *= avail;
            prod %= MOD;
            prod *= Count(node.Children[i], k);
            prod %= MOD;
            avail--;
        }
        return(prod);
    }
Пример #2
0
    private RootedTreeNode[,] PreprocessLCA()
    {
        int N = RootedTreeNodes.Length, M = 0;

        while ((1 << M) < N)
        {
            M++;
        }
        var p = new RootedTreeNode[N, M];

        for (int i = 0; i < N; i++)
        {
            p[i, 0] = RootedTreeNodes[i].Parent;
        }

        for (int j = 1; 1 << j < N; j++)
        {
            for (int i = 0; i < N; i++)
            {
                if (p[i, j - 1] != null)
                {
                    p[i, j] = p[p[i, j - 1].Node.Index, j - 1];
                }
            }
        }

        return(p);
    }
Пример #3
0
 public RootedTree(Graph graph, Node root)
 {
     if (graph == null || root == null || root.Graph != graph || graph.Edges.Count != graph.Nodes.Count - 1)
     {
         throw new ArgumentException();
     }
     RootedTreeNodes = new RootedTreeNode[graph.Nodes.Count];
     Root            = new RootedTreeNode(this, root, null);
 }
Пример #4
0
    public RootedTreeNode GetLowestCommonAncestor(RootedTreeNode p, RootedTreeNode q)
    {
        if (lcaPreprocess == null)
        {
            lcaPreprocess = PreprocessLCA();
        }

        if (p.Level < q.Level)
        {
            RootedTreeNode tmp = p;
            p = q;
            q = tmp;
        }

        int log;

        for (log = 1; 1 << log <= p.Level; log++)
        {
            ;
        }
        log--;

        for (int i = log; i >= 0; i--)
        {
            if (p.Level - (1 << i) >= q.Level)
            {
                p = lcaPreprocess[p.Node.Index, i];
            }
        }

        if (p == q)
        {
            return(p);
        }

        for (int i = log; i >= 0; i--)
        {
            if (lcaPreprocess[p.Node.Index, i] != null &&
                lcaPreprocess[p.Node.Index, i] != lcaPreprocess[q.Node.Index, i])
            {
                p = lcaPreprocess[p.Node.Index, i];
                q = lcaPreprocess[q.Node.Index, i];
            }
        }

        return(p.Parent);
    }
Пример #5
0
    public RootedTreeNode(RootedTree tree, Node node, RootedTreeNode parent)
    {
        Tree   = tree;
        Node   = node;
        Parent = parent;
        Level  = parent == null ? 0 : (parent.Level + 1);

        var children = new List <RootedTreeNode>(node.Degree);

        foreach (Node child in Node.GetAdjacentNodes().Where(x => Parent == null || x != Parent.Node))
        {
            children.Add(new RootedTreeNode(tree, child, this));
        }
        Children = children.ToArray();

        tree.SetNode(this);
    }
Пример #6
0
 internal void SetNode(RootedTreeNode treeNode)
 {
     RootedTreeNodes[treeNode.Node.Index] = treeNode;
 }