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); }
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); }
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); }
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); }
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); }
internal void SetNode(RootedTreeNode treeNode) { RootedTreeNodes[treeNode.Node.Index] = treeNode; }