static void Main() { var n = int.Parse(Console.ReadLine()); var es = Array.ConvertAll(new bool[n - 1], _ => Read()); var qc = int.Parse(Console.ReadLine()); var qs = Array.ConvertAll(new bool[qc], _ => Read5()); var tree = new Tree(n + 1, 1, es); var lca = new BLLca(tree); Console.WriteLine(string.Join("\n", qs .Select(q => { var(x, y, a, b, k) = q; var ab = lca.GetDistance(a, b); if (ab <= k && ab % 2 == k % 2) { return(true); } ab = Math.Min(lca.GetDistance(a, x) + lca.GetDistance(y, b), lca.GetDistance(a, y) + lca.GetDistance(x, b)) + 1; return(ab <= k && ab % 2 == k % 2); }) .Select(b => b ? "YES" : "NO"))); }
static void Main() { var n = int.Parse(Console.ReadLine()); var es = Array.ConvertAll(new bool[n - 1], _ => Read()); var qc = int.Parse(Console.ReadLine()); var tree = new Tree(n + 1, 1, es); var bll = new BLLca(tree); Console.SetOut(new System.IO.StreamWriter(Console.OpenStandardOutput()) { AutoFlush = false }); for (int qi = 0; qi < qc; qi++) { var vs = Read().Skip(1).OrderBy(v => tree.TourMap[v][0]).ToArray(); var k = vs.Length; var r = 0; for (int i = 0; i < k; i++) { r += bll.GetDistance(vs[i], vs[(i + 1) % k]); } Console.WriteLine(r / 2); } Console.Out.Flush(); }
static void Main() { var(n, m) = Read2(); var es = Array.ConvertAll(new bool[m], _ => Read()); var qc = int.Parse(Console.ReadLine()); var qs = Array.ConvertAll(new bool[qc], _ => Read2()); var(treeEdges, es2) = GetUndirectedTree(n + 1, es); var tree = new Tree(n + 1, 1, treeEdges); var lca = new BLLca(tree); var vs2 = es2.SelectMany(e => e).Distinct().ToArray(); var vmap = Enumerable.Range(0, vs2.Length).ToDictionary(i => vs2[i], i => i); var wfes = new List <int[]>(); for (int i = 0; i < vs2.Length; i++) { for (int j = 0; j < vs2.Length; j++) { wfes.Add(new[] { i, j, lca.GetDistance(vs2[i], vs2[j]) }); } } foreach (var e in es2) { wfes.Add(new[] { vmap[e[0]], vmap[e[1]], 1 }); } var wfd = WarshallFloyd(vs2.Length, wfes.ToArray(), false).Item1; Console.SetOut(new System.IO.StreamWriter(Console.OpenStandardOutput()) { AutoFlush = false }); foreach (var(u, v) in qs) { var r = lca.GetDistance(u, v); for (int i = 0; i < vs2.Length; i++) { for (int j = 0; j < vs2.Length; j++) { var d = lca.GetDistance(u, vs2[i]) + (int)wfd[i][j] + lca.GetDistance(vs2[j], v); r = Math.Min(r, d); } } Console.WriteLine(r); } Console.Out.Flush(); }
static void Main() { var n = int.Parse(Console.ReadLine()); var es = Array.ConvertAll(new bool[n - 1], _ => Read()); var qc = int.Parse(Console.ReadLine()); var tree = new Tree(n + 1, 1, es); var bll = new BLLca(tree); Console.SetOut(new System.IO.StreamWriter(Console.OpenStandardOutput()) { AutoFlush = false }); for (int qi = 0; qi < qc; qi++) { var vs = Read().Skip(1).OrderBy(v => tree.TourMap[v][0]).ToArray(); var r = 0; var tv = bll.GetLca(vs[0], vs[^ 1]);
static object Solve() { var n = int.Parse(Console.ReadLine()); var es = Array.ConvertAll(new bool[n - 1], _ => Read()); var m = int.Parse(Console.ReadLine()); var ps = Array.ConvertAll(new bool[m], _ => Read2()); var tree = new Tree(n + 1, 1, es); var bllca = new BLLca(tree); var fs = new ulong[m]; for (int j = 0; j < m; j++) { var(u, v) = ps[j]; var lca = bllca.GetLca(u, v); for (int x = u; x != lca; x = tree.Parents[x]) { fs[j] |= 1UL << x; } for (int x = v; x != lca; x = tree.Parents[x]) { fs[j] |= 1UL << x; } } return(InclusionExclusion(m, GetCount)); long GetCount(bool[] b) { var or = 0UL; for (int j = 0; j < m; j++) { if (b[j]) { or |= fs[j]; } } return(1L << n - 1 - BitOperations.PopCount(or)); } }
static object Solve() { var n = int.Parse(Console.ReadLine()); var es = Array.ConvertAll(new bool[n - 1], _ => Read()); var m = int.Parse(Console.ReadLine()); var ps = Array.ConvertAll(new bool[m], _ => Read2()); var set = new HashSet <int>(); var tree = new Tree(n + 1, 1, es); var bllca = new BLLca(tree); return(InclusionExclusion(m, GetCount)); long GetCount(bool[] b) { set.Clear(); for (int j = 0; j < m; j++) { if (b[j]) { var(u, v) = ps[j]; var lca = bllca.GetLca(u, v); for (int x = u; x != lca; x = tree.Parents[x]) { set.Add(x); } for (int x = v; x != lca; x = tree.Parents[x]) { set.Add(x); } } } return(1L << n - 1 - set.Count); } }
static object Solve() { var n = int.Parse(Console.ReadLine()); var es = Array.ConvertAll(new bool[n - 1], _ => Read()); var m = int.Parse(Console.ReadLine()); var ps = Array.ConvertAll(new bool[m], _ => Read2()); var tree = new Tree(n + 1, 1, es); var bllca = new BLLca(tree); var fs = new ulong[m]; for (int j = 0; j < m; j++) { var(u, v) = ps[j]; var lca = bllca.GetLca(u, v); for (int x = u; x != lca; x = tree.Parents[x]) { fs[j] |= 1UL << x; } for (int x = v; x != lca; x = tree.Parents[x]) { fs[j] |= 1UL << x; } } var dp = new ulong[1 << m]; for (int x = 0; x < 1 << m; x++) { for (int j = 0; j < m; j++) { dp[x | (1 << j)] = dp[x] | fs[j]; } } return(InclusionExclusion(m, x => 1L << n - 1 - BitOperations.PopCount(dp[x]))); }