public override IEnumerable <object> Solve(TextReader inputStream) { var nodesCount = inputStream.ReadInt(); edges = Enumerable.Repeat(0, nodesCount).Select(_ => new List <int>()).ToArray(); for (int i = 0; i < nodesCount - 1; i++) { var ab = inputStream.ReadIntArray().Select(j => j - 1).ToArray(); edges[ab[0]].Add(ab[1]); edges[ab[1]].Add(ab[0]); } dpStates = new DPState[nodesCount]; for (int i = 0; i < dpStates.Length; i++) { dpStates[i] = new DPState(new Modular(1), 0); } Dfs(0, -1); // 0の答えだけはOK Bfs(0, -1); // 1,2,...について、足りない分を足してあげる foreach (var dpState in dpStates) { yield return(dpState.AddRoot().Count.Value); } }
public override IEnumerable <object> Solve(TextReader inputStream) { Modular.InitializeCombinationTable(); var nodesCount = inputStream.ReadInt(); graph = new BasicGraph(nodesCount); for (int i = 0; i < nodesCount - 1; i++) { var(a, b) = inputStream.ReadValue <int, int>(); a--; b--; graph.AddEdge(new BasicEdge(a, b)); graph.AddEdge(new BasicEdge(b, a)); } dpStates = new DPState[nodesCount]; for (int i = 0; i < dpStates.Length; i++) { dpStates[i] = new DPState(new Modular(1), 0); } var rerooting = new Rerooting <BasicNode, BasicEdge, DPState>(graph); var results = rerooting.Solve().Select(r => r.Count.Value); foreach (var result in results) { yield return(result); } }
public override IEnumerable <object> Solve(TextReader inputStream) { var nodesCount = inputStream.ReadInt(); edges = Enumerable.Repeat(0, nodesCount).Select(_ => new List <int>()).ToArray(); for (int i = 0; i < nodesCount - 1; i++) { var ab = inputStream.ReadIntArray().Select(j => j - 1).ToArray(); edges[ab[0]].Add(ab[1]); edges[ab[1]].Add(ab[0]); } dpStates = new DPState[nodesCount]; for (int i = 0; i < dpStates.Length; i++) { dpStates[i] = new DPState(new Modular(1), 0); } var rerooting = new Rerooting <DPState>(edges); var results = rerooting.Solve().Select(r => r.Count.Value); foreach (var result in results) { yield return(result); } }