public void 重み付きグラフ() { var gb = new WIntGraphBuilder(8, true); gb.Add(0, 1, 1); gb.Add(1, 2, 2); gb.Add(2, 3, 3); gb.Add(3, 4, 4); gb.Add(4, 5, 5); gb.Add(5, 6, 6); gb.Add(6, 2, 7); gb.Add(2, 4, 8); gb.Add(4, 7, 9); gb.Add(7, 0, 10); var(from, edges) = gb.ToGraph().EulerianTrail(); from.Should().Be(0); edges.Should().Equal(new WEdge <int>[] { new WEdge <int>(1, 1), new WEdge <int>(2, 2), new WEdge <int>(3, 3), new WEdge <int>(4, 4), new WEdge <int>(5, 5), new WEdge <int>(6, 6), new WEdge <int>(2, 7), new WEdge <int>(4, 8), new WEdge <int>(7, 9), new WEdge <int>(0, 10), }); }
public void Root() { var gb = new WIntGraphBuilder(4, false); gb.Add(0, 1, 1); gb.Add(0, 2, 1); gb.Add(1, 2, 1); gb.Add(0, 3, 5); var graph = gb.ToGraph(); graph.Prim().Should().Equal( (0, new WEdge <int>(1, 1)), (0, new WEdge <int>(2, 1)), (0, new WEdge <int>(3, 5))); graph.Prim(1).Should().Equal( (1, new WEdge <int>(0, 1)), (1, new WEdge <int>(2, 1)), (0, new WEdge <int>(3, 5))); graph.Prim(2).Should().Equal( (2, new WEdge <int>(0, 1)), (2, new WEdge <int>(1, 1)), (0, new WEdge <int>(3, 5))); graph.Prim(3).Should().Equal( (3, new WEdge <int>(0, 5)), (0, new WEdge <int>(1, 1)), (0, new WEdge <int>(2, 1))); }
public void 重み付きグラフ() { var gb = new WIntGraphBuilder(5, true); gb.Add(0, 1, 1); gb.Add(0, 2, 10); gb.Add(0, 3, 30); gb.Add(0, 4, 40); gb.Add(1, 2, 5); gb.Add(2, 3, 605); gb.Add(2, 4, 6); gb.Add(4, 3, 6); gb.Add(4, 0, 1); var graph = gb.ToGraph(); graph.ShortestPathBFS(0).Should().Equal(0u, 1u, 1u, 1u, 1u); graph.ShortestPathBFS(1).Should().Equal(3u, 0u, 1u, 2u, 2u); graph.ShortestPathBFS(2).Should().Equal(2u, 3u, 0u, 1u, 1u); graph.ShortestPathBFS(3).Should().Equal(4294967295u, 4294967295u, 4294967295u, 0u, 4294967295u); graph.ShortestPathBFS(4).Should().Equal(1u, 2u, 2u, 1u, 0u); graph.ShortestPathBFSReverse(0).Should().Equal(0u, 3u, 2u, 4294967295u, 1u); graph.ShortestPathBFSReverse(1).Should().Equal(1u, 0u, 3u, 4294967295u, 2u); graph.ShortestPathBFSReverse(2).Should().Equal(1u, 1u, 0u, 4294967295u, 2u); graph.ShortestPathBFSReverse(3).Should().Equal(1u, 2u, 1u, 0u, 1u); graph.ShortestPathBFSReverse(4).Should().Equal(1u, 2u, 1u, 4294967295u, 0u); }
public void Random() { const int N = 60; var wgb = new WIntGraphBuilder(N, false); var gb = new GraphBuilder(N, false); var arr = Enumerable.Range(0, N).OrderBy(_ => Guid.NewGuid()).ToArray(); for (int i = 1; i < arr.Length; i++) { gb.Add(arr[i - 1], arr[i]); wgb.Add(arr[i - 1], arr[i], i); } for (int r = 0; r < N; r++) { var tree = gb.ToTree(r); var wtree = wgb.ToTree(r); var lca = tree.LowestCommonAncestor(); var wlca = wtree.LowestCommonAncestor(); for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { var(expectedLca, expectedDist) = LcaDirect(tree.AsArray(), i, j); lca.Lca(i, j).Should().Be(expectedLca); wlca.Lca(i, j).Should().Be(expectedLca); lca.Distance(i, j).Should().Be(expectedDist); wlca.Distance(i, j).Should().Be(expectedDist); } } } }
public void 森の連結重み付き() { var gb = new WIntGraphBuilder(4, false); gb.Add(0, 2, 1); gb.Add(1, 3, 1); gb.Add(2, 3, 10); var graph = gb.ToGraph(); var res = graph.Kruskal(); res.Should().HaveCount(1); res[0].Should().Equal( (0, new WEdge <int>(2, 1)), (1, new WEdge <int>(3, 1)), (2, new WEdge <int>(3, 10))); }
public void Int() { var gb = new WIntGraphBuilder(5, true); gb.Add(0, 1, 1); gb.Add(0, 2, 10); gb.Add(0, 3, 30); gb.Add(0, 4, 40); gb.Add(1, 2, 5); gb.Add(2, 3, 605); gb.Add(2, 4, 6); gb.Add(4, 3, 6); gb.Add(4, 0, 1); var graph = gb.ToMFGraph(); graph.Flow(0, 1).Should().Be(1); graph.Flow(0, 3).Should().Be(46); }
public void Int() { var gb = new WIntGraphBuilder(5, true); gb.Add(0, 1, 1); gb.Add(0, 2, 10); gb.Add(0, 3, 30); gb.Add(0, 4, 40); gb.Add(1, 2, 5); gb.Add(2, 3, 605); gb.Add(2, 4, 6); gb.Add(4, 3, 6); gb.Add(4, 0, 1); var graph = gb.ToGraph(); graph.BellmanFord(0).Should().Equal(new int[] { 0, 1, 6, 18, 12 }); graph.BellmanFord(1).Should().Equal(new int[] { 12, 0, 5, 17, 11 }); graph.BellmanFord(2).Should().Equal(new int[] { 7, 8, 0, 12, 6 }); graph.BellmanFord(3).Should().Equal(new int[] { 1073741823, 1073741823, 1073741823, 0, 1073741823 }); graph.BellmanFord(4).Should().Equal(new int[] { 1, 2, 7, 6, 0 }); }
public void Int() { var gb = new WIntGraphBuilder(5, true); gb.Add(0, 1, 1); gb.Add(0, 2, 10); gb.Add(0, 3, 30); gb.Add(0, 4, 40); gb.Add(1, 2, 5); gb.Add(2, 3, 605); gb.Add(2, 4, 6); gb.Add(4, 3, 6); gb.Add(4, 0, 1); var graph = gb.ToGraph(); graph.Dijkstra(0).Should().Equal(new int[] { 0, 1, 6, 18, 12 }); graph.Dijkstra(1).Should().Equal(new int[] { 12, 0, 5, 17, 11 }); graph.Dijkstra(2).Should().Equal(new int[] { 7, 8, 0, 12, 6 }); graph.Dijkstra(3).Should().Equal(new int[] { int.MaxValue, int.MaxValue, int.MaxValue, 0, int.MaxValue }); graph.Dijkstra(4).Should().Equal(new int[] { 1, 2, 7, 6, 0 }); }
public void Int() { var gb = new WIntGraphBuilder(5, false); gb.Add(0, 1, 1); gb.Add(0, 2, 10); gb.Add(0, 3, 30); gb.Add(0, 4, 40); gb.Add(1, 2, 5); gb.Add(2, 3, 605); gb.Add(2, 4, 6); gb.Add(4, 3, 6); gb.Add(4, 0, 1); var graph = gb.ToGraph(); graph.Prim().Should().Equal( (0, new WEdge <int>(1, 1)), (0, new WEdge <int>(4, 1)), (1, new WEdge <int>(2, 5)), (4, new WEdge <int>(3, 6))); }
public void Int() { var gb = new WIntGraphBuilder(5, true); gb.Add(0, 1, 1); gb.Add(0, 2, 10); gb.Add(0, 3, 30); gb.Add(0, 4, 40); gb.Add(1, 2, 5); gb.Add(2, 3, 605); gb.Add(2, 4, 6); gb.Add(4, 3, 6); gb.Add(4, 0, 1); var res = gb.ToGraph().WarshallFloyd(); res[0].Should().Equal(new int[] { 0, 1, 6, 18, 12 }); res[1].Should().Equal(new int[] { 12, 0, 5, 17, 11 }); res[2].Should().Equal(new int[] { 7, 8, 0, 12, 6 }); res[3].Should().Equal(new int[] { 1073741823, 1073741823, 1073741823, 0, 1073741823 }); res[4].Should().Equal(new int[] { 1, 2, 7, 6, 0 }); }
public void Int() { var gb = new WIntGraphBuilder(5, true); gb.Add(0, 1, 1); gb.Add(0, 2, 0); gb.Add(0, 3, 1); gb.Add(0, 4, 1); gb.Add(1, 2, 0); gb.Add(2, 3, 1); gb.Add(2, 4, 0); gb.Add(4, 3, 1); gb.Add(4, 0, 1); var graph = gb.ToGraph(); graph.ShortestPath01BFS(0).Should().Equal(new int[] { 0, 1, 0, 1, 0 }); graph.ShortestPath01BFS(1).Should().Equal(new int[] { 1, 0, 0, 1, 0 }); graph.ShortestPath01BFS(2).Should().Equal(new int[] { 1, 2, 0, 1, 0 }); graph.ShortestPath01BFS(3).Should().Equal(new int[] { int.MaxValue, int.MaxValue, int.MaxValue, 0, int.MaxValue }); graph.ShortestPath01BFS(4).Should().Equal(new int[] { 1, 2, 1, 1, 0 }); }
public void 重み付きグラフ() { var gb = new WIntGraphBuilder(5, false); gb.Add(0, 1, 1); gb.Add(0, 2, 10); gb.Add(0, 3, 30); gb.Add(0, 4, 40); gb.Add(1, 2, 5); gb.Add(2, 3, 605); gb.Add(2, 4, 6); gb.Add(4, 3, 6); gb.Add(4, 0, 1); var graph = gb.ToGraph(); graph.MinimumSpanningTreeBFS().Should().Equal( (0, new WEdge <int>(1, 1)), (0, new WEdge <int>(2, 10)), (0, new WEdge <int>(3, 30)), (0, new WEdge <int>(4, 40))); }
public void Int() { var gb = new WIntGraphBuilder(5, false); gb.Add(0, 1, 1); gb.Add(0, 2, 10); gb.Add(0, 3, 30); gb.Add(0, 4, 40); gb.Add(1, 2, 5); gb.Add(2, 3, 605); gb.Add(2, 4, 6); gb.Add(4, 3, 6); gb.Add(4, 0, 1); var graph = gb.ToGraph(); var res = graph.Kruskal(); res.Should().HaveCount(1); res[0].Should().Equal( (0, new WEdge <int>(1, 1)), (0, new WEdge <int>(4, 1)), (1, new WEdge <int>(2, 5)), (4, new WEdge <int>(3, 6))); }
public void 重み付きグラフ() { var gb = new WIntGraphBuilder(8, true); gb.Add(0, 1, 1); gb.Add(1, 2, 2); gb.Add(2, 3, 3); gb.Add(3, 4, 4); gb.Add(4, 5, 5); gb.Add(5, 6, 6); gb.Add(4, 7, 7); gb.Add(7, 3, 8); var(from, edges) = gb.ToGraph().GetCycleDFS(); from.Should().Be(3); edges.Should().Equal(new WEdge <int>[] { new WEdge <int>(4, 4), new WEdge <int>(7, 7), new WEdge <int>(3, 8), }); }
public void 重み付きグラフ() { var gb = new WIntGraphBuilder(8, true); gb.Add(0, 1, 1); gb.Add(1, 2, 2); gb.Add(2, 3, 3); gb.Add(3, 4, 4); gb.Add(4, 5, 5); gb.Add(5, 6, 6); gb.Add(4, 7, 7); gb.Add(7, 3, 8); var scc = gb.ToGraph().Scc(); scc[0].Should().Equal(0); scc[1].Should().Equal(1); scc[2].Should().Equal(2); scc[3].Should().Equal(3, 4, 7); scc[4].Should().Equal(5); scc[5].Should().Equal(6); }
public void 重み付きグラフ() { var gb = new WIntGraphBuilder(8, false); gb.Add(0, 1, 1); gb.Add(0, 2, 2); gb.Add(1, 3, 3); gb.Add(1, 4, 4); gb.Add(2, 5, 5); gb.Add(2, 6, 6); gb.Add(3, 7, 7); var tree = gb.ToTree(); var tour = tree.EulerianTour(); tour.Events.Should().Equal( new オイラーツアー <WEdge <int> > .Event(-1, new WEdge <int>(0, 0), true), new オイラーツアー <WEdge <int> > .Event(0, new WEdge <int>(1, 1), true), new オイラーツアー <WEdge <int> > .Event(1, new WEdge <int>(3, 3), true), new オイラーツアー <WEdge <int> > .Event(3, new WEdge <int>(7, 7), true), new オイラーツアー <WEdge <int> > .Event(3, new WEdge <int>(7, 7), false), new オイラーツアー <WEdge <int> > .Event(1, new WEdge <int>(3, 3), false), new オイラーツアー <WEdge <int> > .Event(1, new WEdge <int>(4, 4), true), new オイラーツアー <WEdge <int> > .Event(1, new WEdge <int>(4, 4), false), new オイラーツアー <WEdge <int> > .Event(0, new WEdge <int>(1, 1), false), new オイラーツアー <WEdge <int> > .Event(0, new WEdge <int>(2, 2), true), new オイラーツアー <WEdge <int> > .Event(2, new WEdge <int>(5, 5), true), new オイラーツアー <WEdge <int> > .Event(2, new WEdge <int>(5, 5), false), new オイラーツアー <WEdge <int> > .Event(2, new WEdge <int>(6, 6), true), new オイラーツアー <WEdge <int> > .Event(2, new WEdge <int>(6, 6), false), new オイラーツアー <WEdge <int> > .Event(0, new WEdge <int>(2, 2), false), new オイラーツアー <WEdge <int> > .Event(-1, new WEdge <int>(0, 0), false)); Enumerable.Range(0, 8).Select(i => tour[i]).Should().Equal( (0, 15), (1, 8), (9, 14), (2, 5), (6, 7), (10, 11), (12, 13), (3, 4)); var lca = tree.LowestCommonAncestor(); for (int i = 0; i < 8; i++) { for (int j = 0; j < 8; j++) { tour.LowestCommonAncestor(i, j).Should().Be(lca.Lca(i, j)); } } }
public 木の探索Tests() { gb = new GraphBuilder(8, false); gb.Add(0, 1); gb.Add(0, 2); gb.Add(1, 3); gb.Add(1, 4); gb.Add(2, 5); gb.Add(2, 6); gb.Add(3, 7); wgb = new WIntGraphBuilder(8, false); wgb.Add(0, 1, 1); wgb.Add(0, 2, 2); wgb.Add(1, 3, 3); wgb.Add(1, 4, 4); wgb.Add(2, 5, 5); wgb.Add(2, 6, 6); wgb.Add(3, 7, 7); }
public void 連結ではない重み付き() { var gb = new WIntGraphBuilder(8, false); gb.Add(0, 1, 1); gb.Add(0, 2, 2); gb.Add(1, 2, 3); gb.Add(4, 3, 4); gb.Add(4, 7, 5); gb.Add(3, 7, 10); gb.Add(6, 5, 6); var graph = gb.ToGraph(); var res = graph.Kruskal(); res.Should().HaveCount(3); res[0].Should().Equal( (0, new WEdge <int>(1, 1)), (0, new WEdge <int>(2, 2))); res[1].Should().Equal( (3, new WEdge <int>(4, 4)), (4, new WEdge <int>(7, 5))); res[2].Should().Equal( (5, new WEdge <int>(6, 6))); }
public void 重み付きグラフ() { var gb = new WIntGraphBuilder(8, false); gb.Add(0, 1, 1); gb.Add(0, 2, 2); gb.Add(1, 3, 3); gb.Add(1, 4, 4); gb.Add(2, 5, 5); gb.Add(2, 6, 6); gb.Add(3, 7, 7); var tree = gb.ToTree(); var lca0 = tree.LowestCommonAncestorWithDataBuilder().Build <int, TOp>(tree.AsArray().Select(n => n.Root.Value).ToArray()); lca0.Lca(0, 0).Should().Be((0, 0)); lca0.Lca(0, 1).Should().Be((0, 1)); lca0.Lca(0, 2).Should().Be((0, 2)); lca0.Lca(0, 3).Should().Be((0, 4)); lca0.Lca(0, 4).Should().Be((0, 5)); lca0.Lca(0, 5).Should().Be((0, 7)); lca0.Lca(0, 6).Should().Be((0, 8)); lca0.Lca(0, 7).Should().Be((0, 11)); lca0.Lca(1, 0).Should().Be((0, 1)); lca0.Lca(1, 1).Should().Be((1, 0)); lca0.Lca(1, 2).Should().Be((0, 3)); lca0.Lca(1, 3).Should().Be((1, 3)); lca0.Lca(1, 4).Should().Be((1, 4)); lca0.Lca(1, 5).Should().Be((0, 8)); lca0.Lca(1, 6).Should().Be((0, 9)); lca0.Lca(1, 7).Should().Be((1, 10)); lca0.Lca(2, 0).Should().Be((0, 2)); lca0.Lca(2, 1).Should().Be((0, 3)); lca0.Lca(2, 2).Should().Be((2, 0)); lca0.Lca(2, 3).Should().Be((0, 6)); lca0.Lca(2, 4).Should().Be((0, 7)); lca0.Lca(2, 5).Should().Be((2, 5)); lca0.Lca(2, 6).Should().Be((2, 6)); lca0.Lca(2, 7).Should().Be((0, 13)); lca0.Lca(3, 0).Should().Be((0, 4)); lca0.Lca(3, 1).Should().Be((1, 3)); lca0.Lca(3, 2).Should().Be((0, 6)); lca0.Lca(3, 3).Should().Be((3, 0)); lca0.Lca(3, 4).Should().Be((1, 7)); lca0.Lca(3, 5).Should().Be((0, 11)); lca0.Lca(3, 6).Should().Be((0, 12)); lca0.Lca(3, 7).Should().Be((3, 7)); lca0.Lca(4, 0).Should().Be((0, 5)); lca0.Lca(4, 1).Should().Be((1, 4)); lca0.Lca(4, 2).Should().Be((0, 7)); lca0.Lca(4, 3).Should().Be((1, 7)); lca0.Lca(4, 4).Should().Be((4, 0)); lca0.Lca(4, 5).Should().Be((0, 12)); lca0.Lca(4, 6).Should().Be((0, 13)); lca0.Lca(4, 7).Should().Be((1, 14)); lca0.Lca(5, 0).Should().Be((0, 7)); lca0.Lca(5, 1).Should().Be((0, 8)); lca0.Lca(5, 2).Should().Be((2, 5)); lca0.Lca(5, 3).Should().Be((0, 11)); lca0.Lca(5, 4).Should().Be((0, 12)); lca0.Lca(5, 5).Should().Be((5, 0)); lca0.Lca(5, 6).Should().Be((2, 11)); lca0.Lca(5, 7).Should().Be((0, 18)); lca0.Lca(6, 0).Should().Be((0, 8)); lca0.Lca(6, 1).Should().Be((0, 9)); lca0.Lca(6, 2).Should().Be((2, 6)); lca0.Lca(6, 3).Should().Be((0, 12)); lca0.Lca(6, 4).Should().Be((0, 13)); lca0.Lca(6, 5).Should().Be((2, 11)); lca0.Lca(6, 6).Should().Be((6, 0)); lca0.Lca(6, 7).Should().Be((0, 19)); lca0.Lca(7, 0).Should().Be((0, 11)); lca0.Lca(7, 1).Should().Be((1, 10)); lca0.Lca(7, 2).Should().Be((0, 13)); lca0.Lca(7, 3).Should().Be((3, 7)); lca0.Lca(7, 4).Should().Be((1, 14)); lca0.Lca(7, 5).Should().Be((0, 18)); lca0.Lca(7, 6).Should().Be((0, 19)); lca0.Lca(7, 7).Should().Be((7, 0)); lca0[0, 0].Should().Be((0, 0)); lca0[0, 1].Should().Be((0, 1)); lca0[0, 2].Should().Be((0, 2)); lca0[0, 3].Should().Be((0, 4)); lca0[0, 4].Should().Be((0, 5)); lca0[0, 5].Should().Be((0, 7)); lca0[0, 6].Should().Be((0, 8)); lca0[0, 7].Should().Be((0, 11)); lca0[1, 0].Should().Be((0, 1)); lca0[1, 1].Should().Be((1, 0)); lca0[1, 2].Should().Be((0, 3)); lca0[1, 3].Should().Be((1, 3)); lca0[1, 4].Should().Be((1, 4)); lca0[1, 5].Should().Be((0, 8)); lca0[1, 6].Should().Be((0, 9)); lca0[1, 7].Should().Be((1, 10)); lca0[2, 0].Should().Be((0, 2)); lca0[2, 1].Should().Be((0, 3)); lca0[2, 2].Should().Be((2, 0)); lca0[2, 3].Should().Be((0, 6)); lca0[2, 4].Should().Be((0, 7)); lca0[2, 5].Should().Be((2, 5)); lca0[2, 6].Should().Be((2, 6)); lca0[2, 7].Should().Be((0, 13)); lca0[3, 0].Should().Be((0, 4)); lca0[3, 1].Should().Be((1, 3)); lca0[3, 2].Should().Be((0, 6)); lca0[3, 3].Should().Be((3, 0)); lca0[3, 4].Should().Be((1, 7)); lca0[3, 5].Should().Be((0, 11)); lca0[3, 6].Should().Be((0, 12)); lca0[3, 7].Should().Be((3, 7)); lca0[4, 0].Should().Be((0, 5)); lca0[4, 1].Should().Be((1, 4)); lca0[4, 2].Should().Be((0, 7)); lca0[4, 3].Should().Be((1, 7)); lca0[4, 4].Should().Be((4, 0)); lca0[4, 5].Should().Be((0, 12)); lca0[4, 6].Should().Be((0, 13)); lca0[4, 7].Should().Be((1, 14)); lca0[5, 0].Should().Be((0, 7)); lca0[5, 1].Should().Be((0, 8)); lca0[5, 2].Should().Be((2, 5)); lca0[5, 3].Should().Be((0, 11)); lca0[5, 4].Should().Be((0, 12)); lca0[5, 5].Should().Be((5, 0)); lca0[5, 6].Should().Be((2, 11)); lca0[5, 7].Should().Be((0, 18)); lca0[6, 0].Should().Be((0, 8)); lca0[6, 1].Should().Be((0, 9)); lca0[6, 2].Should().Be((2, 6)); lca0[6, 3].Should().Be((0, 12)); lca0[6, 4].Should().Be((0, 13)); lca0[6, 5].Should().Be((2, 11)); lca0[6, 6].Should().Be((6, 0)); lca0[6, 7].Should().Be((0, 19)); lca0[7, 0].Should().Be((0, 11)); lca0[7, 1].Should().Be((1, 10)); lca0[7, 2].Should().Be((0, 13)); lca0[7, 3].Should().Be((3, 7)); lca0[7, 4].Should().Be((1, 14)); lca0[7, 5].Should().Be((0, 18)); lca0[7, 6].Should().Be((0, 19)); lca0[7, 7].Should().Be((7, 0)); lca0.ChildOfLca(0, 0).Should().Be((0, 0)); lca0.ChildOfLca(0, 1).Should().Be((0, 1)); lca0.ChildOfLca(0, 2).Should().Be((0, 2)); lca0.ChildOfLca(0, 3).Should().Be((0, 1)); lca0.ChildOfLca(0, 4).Should().Be((0, 1)); lca0.ChildOfLca(0, 5).Should().Be((0, 2)); lca0.ChildOfLca(0, 6).Should().Be((0, 2)); lca0.ChildOfLca(0, 7).Should().Be((0, 1)); lca0.ChildOfLca(1, 0).Should().Be((1, 0)); lca0.ChildOfLca(1, 1).Should().Be((1, 1)); lca0.ChildOfLca(1, 2).Should().Be((1, 2)); lca0.ChildOfLca(1, 3).Should().Be((1, 3)); lca0.ChildOfLca(1, 4).Should().Be((1, 4)); lca0.ChildOfLca(1, 5).Should().Be((1, 2)); lca0.ChildOfLca(1, 6).Should().Be((1, 2)); lca0.ChildOfLca(1, 7).Should().Be((1, 3)); lca0.ChildOfLca(2, 0).Should().Be((2, 0)); lca0.ChildOfLca(2, 1).Should().Be((2, 1)); lca0.ChildOfLca(2, 2).Should().Be((2, 2)); lca0.ChildOfLca(2, 3).Should().Be((2, 1)); lca0.ChildOfLca(2, 4).Should().Be((2, 1)); lca0.ChildOfLca(2, 5).Should().Be((2, 5)); lca0.ChildOfLca(2, 6).Should().Be((2, 6)); lca0.ChildOfLca(2, 7).Should().Be((2, 1)); lca0.ChildOfLca(3, 0).Should().Be((1, 0)); lca0.ChildOfLca(3, 1).Should().Be((3, 1)); lca0.ChildOfLca(1, 2).Should().Be((1, 2)); lca0.ChildOfLca(3, 3).Should().Be((3, 3)); lca0.ChildOfLca(3, 4).Should().Be((3, 4)); lca0.ChildOfLca(3, 5).Should().Be((1, 2)); lca0.ChildOfLca(3, 6).Should().Be((1, 2)); lca0.ChildOfLca(3, 7).Should().Be((3, 7)); lca0.ChildOfLca(4, 0).Should().Be((1, 0)); lca0.ChildOfLca(4, 1).Should().Be((4, 1)); lca0.ChildOfLca(4, 2).Should().Be((1, 2)); lca0.ChildOfLca(4, 3).Should().Be((4, 3)); lca0.ChildOfLca(4, 4).Should().Be((4, 4)); lca0.ChildOfLca(4, 5).Should().Be((1, 2)); lca0.ChildOfLca(4, 6).Should().Be((1, 2)); lca0.ChildOfLca(4, 7).Should().Be((4, 3)); lca0.ChildOfLca(5, 0).Should().Be((2, 0)); lca0.ChildOfLca(5, 1).Should().Be((2, 1)); lca0.ChildOfLca(5, 2).Should().Be((5, 2)); lca0.ChildOfLca(5, 3).Should().Be((2, 1)); lca0.ChildOfLca(5, 4).Should().Be((2, 1)); lca0.ChildOfLca(5, 5).Should().Be((5, 5)); lca0.ChildOfLca(5, 6).Should().Be((5, 6)); lca0.ChildOfLca(5, 7).Should().Be((2, 1)); lca0.ChildOfLca(6, 0).Should().Be((2, 0)); lca0.ChildOfLca(6, 1).Should().Be((2, 1)); lca0.ChildOfLca(6, 2).Should().Be((6, 2)); lca0.ChildOfLca(6, 3).Should().Be((2, 1)); lca0.ChildOfLca(6, 4).Should().Be((2, 1)); lca0.ChildOfLca(6, 5).Should().Be((6, 5)); lca0.ChildOfLca(6, 6).Should().Be((6, 6)); lca0.ChildOfLca(6, 7).Should().Be((2, 1)); lca0.ChildOfLca(7, 0).Should().Be((1, 0)); lca0.ChildOfLca(7, 1).Should().Be((3, 1)); lca0.ChildOfLca(7, 2).Should().Be((1, 2)); lca0.ChildOfLca(7, 3).Should().Be((7, 3)); lca0.ChildOfLca(7, 4).Should().Be((3, 4)); lca0.ChildOfLca(7, 5).Should().Be((1, 2)); lca0.ChildOfLca(7, 6).Should().Be((1, 2)); lca0.ChildOfLca(7, 7).Should().Be((7, 7)); }
public void 重み付きグラフ() { var gb = new WIntGraphBuilder(8, false); gb.Add(0, 1, 1); gb.Add(0, 2, 2); gb.Add(1, 3, 3); gb.Add(1, 4, 4); gb.Add(2, 5, 5); gb.Add(2, 6, 6); gb.Add(3, 7, 7); var lca0 = gb.ToTree().LowestCommonAncestor(); lca0.Lca(0, 0).Should().Be(0); lca0.Lca(0, 1).Should().Be(0); lca0.Lca(0, 2).Should().Be(0); lca0.Lca(0, 3).Should().Be(0); lca0.Lca(0, 4).Should().Be(0); lca0.Lca(0, 5).Should().Be(0); lca0.Lca(0, 6).Should().Be(0); lca0.Lca(0, 7).Should().Be(0); lca0.Lca(1, 0).Should().Be(0); lca0.Lca(1, 1).Should().Be(1); lca0.Lca(1, 2).Should().Be(0); lca0.Lca(1, 3).Should().Be(1); lca0.Lca(1, 4).Should().Be(1); lca0.Lca(1, 5).Should().Be(0); lca0.Lca(1, 6).Should().Be(0); lca0.Lca(1, 7).Should().Be(1); lca0.Lca(2, 0).Should().Be(0); lca0.Lca(2, 1).Should().Be(0); lca0.Lca(2, 2).Should().Be(2); lca0.Lca(2, 3).Should().Be(0); lca0.Lca(2, 4).Should().Be(0); lca0.Lca(2, 5).Should().Be(2); lca0.Lca(2, 6).Should().Be(2); lca0.Lca(2, 7).Should().Be(0); lca0.Lca(3, 0).Should().Be(0); lca0.Lca(3, 1).Should().Be(1); lca0.Lca(3, 2).Should().Be(0); lca0.Lca(3, 3).Should().Be(3); lca0.Lca(3, 4).Should().Be(1); lca0.Lca(3, 5).Should().Be(0); lca0.Lca(3, 6).Should().Be(0); lca0.Lca(3, 7).Should().Be(3); lca0.Lca(4, 0).Should().Be(0); lca0.Lca(4, 1).Should().Be(1); lca0.Lca(4, 2).Should().Be(0); lca0.Lca(4, 3).Should().Be(1); lca0.Lca(4, 4).Should().Be(4); lca0.Lca(4, 5).Should().Be(0); lca0.Lca(4, 6).Should().Be(0); lca0.Lca(4, 7).Should().Be(1); lca0.Lca(5, 0).Should().Be(0); lca0.Lca(5, 1).Should().Be(0); lca0.Lca(5, 2).Should().Be(2); lca0.Lca(5, 3).Should().Be(0); lca0.Lca(5, 4).Should().Be(0); lca0.Lca(5, 5).Should().Be(5); lca0.Lca(5, 6).Should().Be(2); lca0.Lca(5, 7).Should().Be(0); lca0.Lca(6, 0).Should().Be(0); lca0.Lca(6, 1).Should().Be(0); lca0.Lca(6, 2).Should().Be(2); lca0.Lca(6, 3).Should().Be(0); lca0.Lca(6, 4).Should().Be(0); lca0.Lca(6, 5).Should().Be(2); lca0.Lca(6, 6).Should().Be(6); lca0.Lca(6, 7).Should().Be(0); lca0.Lca(7, 0).Should().Be(0); lca0.Lca(7, 1).Should().Be(1); lca0.Lca(7, 2).Should().Be(0); lca0.Lca(7, 3).Should().Be(3); lca0.Lca(7, 4).Should().Be(1); lca0.Lca(7, 5).Should().Be(0); lca0.Lca(7, 6).Should().Be(0); lca0.Lca(7, 7).Should().Be(7); lca0[0, 0].Should().Be(0); lca0[0, 1].Should().Be(0); lca0[0, 2].Should().Be(0); lca0[0, 3].Should().Be(0); lca0[0, 4].Should().Be(0); lca0[0, 5].Should().Be(0); lca0[0, 6].Should().Be(0); lca0[0, 7].Should().Be(0); lca0[1, 0].Should().Be(0); lca0[1, 1].Should().Be(1); lca0[1, 2].Should().Be(0); lca0[1, 3].Should().Be(1); lca0[1, 4].Should().Be(1); lca0[1, 5].Should().Be(0); lca0[1, 6].Should().Be(0); lca0[1, 7].Should().Be(1); lca0[2, 0].Should().Be(0); lca0[2, 1].Should().Be(0); lca0[2, 2].Should().Be(2); lca0[2, 3].Should().Be(0); lca0[2, 4].Should().Be(0); lca0[2, 5].Should().Be(2); lca0[2, 6].Should().Be(2); lca0[2, 7].Should().Be(0); lca0[3, 0].Should().Be(0); lca0[3, 1].Should().Be(1); lca0[3, 2].Should().Be(0); lca0[3, 3].Should().Be(3); lca0[3, 4].Should().Be(1); lca0[3, 5].Should().Be(0); lca0[3, 6].Should().Be(0); lca0[3, 7].Should().Be(3); lca0[4, 0].Should().Be(0); lca0[4, 1].Should().Be(1); lca0[4, 2].Should().Be(0); lca0[4, 3].Should().Be(1); lca0[4, 4].Should().Be(4); lca0[4, 5].Should().Be(0); lca0[4, 6].Should().Be(0); lca0[4, 7].Should().Be(1); lca0[5, 0].Should().Be(0); lca0[5, 1].Should().Be(0); lca0[5, 2].Should().Be(2); lca0[5, 3].Should().Be(0); lca0[5, 4].Should().Be(0); lca0[5, 5].Should().Be(5); lca0[5, 6].Should().Be(2); lca0[5, 7].Should().Be(0); lca0[6, 0].Should().Be(0); lca0[6, 1].Should().Be(0); lca0[6, 2].Should().Be(2); lca0[6, 3].Should().Be(0); lca0[6, 4].Should().Be(0); lca0[6, 5].Should().Be(2); lca0[6, 6].Should().Be(6); lca0[6, 7].Should().Be(0); lca0[7, 0].Should().Be(0); lca0[7, 1].Should().Be(1); lca0[7, 2].Should().Be(0); lca0[7, 3].Should().Be(3); lca0[7, 4].Should().Be(1); lca0[7, 5].Should().Be(0); lca0[7, 6].Should().Be(0); lca0[7, 7].Should().Be(7); lca0.ChildOfLca(0, 0).Should().Be((0, 0)); lca0.ChildOfLca(0, 1).Should().Be((0, 1)); lca0.ChildOfLca(0, 2).Should().Be((0, 2)); lca0.ChildOfLca(0, 3).Should().Be((0, 1)); lca0.ChildOfLca(0, 4).Should().Be((0, 1)); lca0.ChildOfLca(0, 5).Should().Be((0, 2)); lca0.ChildOfLca(0, 6).Should().Be((0, 2)); lca0.ChildOfLca(0, 7).Should().Be((0, 1)); lca0.ChildOfLca(1, 0).Should().Be((1, 0)); lca0.ChildOfLca(1, 1).Should().Be((1, 1)); lca0.ChildOfLca(1, 2).Should().Be((1, 2)); lca0.ChildOfLca(1, 3).Should().Be((1, 3)); lca0.ChildOfLca(1, 4).Should().Be((1, 4)); lca0.ChildOfLca(1, 5).Should().Be((1, 2)); lca0.ChildOfLca(1, 6).Should().Be((1, 2)); lca0.ChildOfLca(1, 7).Should().Be((1, 3)); lca0.ChildOfLca(2, 0).Should().Be((2, 0)); lca0.ChildOfLca(2, 1).Should().Be((2, 1)); lca0.ChildOfLca(2, 2).Should().Be((2, 2)); lca0.ChildOfLca(2, 3).Should().Be((2, 1)); lca0.ChildOfLca(2, 4).Should().Be((2, 1)); lca0.ChildOfLca(2, 5).Should().Be((2, 5)); lca0.ChildOfLca(2, 6).Should().Be((2, 6)); lca0.ChildOfLca(2, 7).Should().Be((2, 1)); lca0.ChildOfLca(3, 0).Should().Be((1, 0)); lca0.ChildOfLca(3, 1).Should().Be((3, 1)); lca0.ChildOfLca(1, 2).Should().Be((1, 2)); lca0.ChildOfLca(3, 3).Should().Be((3, 3)); lca0.ChildOfLca(3, 4).Should().Be((3, 4)); lca0.ChildOfLca(3, 5).Should().Be((1, 2)); lca0.ChildOfLca(3, 6).Should().Be((1, 2)); lca0.ChildOfLca(3, 7).Should().Be((3, 7)); lca0.ChildOfLca(4, 0).Should().Be((1, 0)); lca0.ChildOfLca(4, 1).Should().Be((4, 1)); lca0.ChildOfLca(4, 2).Should().Be((1, 2)); lca0.ChildOfLca(4, 3).Should().Be((4, 3)); lca0.ChildOfLca(4, 4).Should().Be((4, 4)); lca0.ChildOfLca(4, 5).Should().Be((1, 2)); lca0.ChildOfLca(4, 6).Should().Be((1, 2)); lca0.ChildOfLca(4, 7).Should().Be((4, 3)); lca0.ChildOfLca(5, 0).Should().Be((2, 0)); lca0.ChildOfLca(5, 1).Should().Be((2, 1)); lca0.ChildOfLca(5, 2).Should().Be((5, 2)); lca0.ChildOfLca(5, 3).Should().Be((2, 1)); lca0.ChildOfLca(5, 4).Should().Be((2, 1)); lca0.ChildOfLca(5, 5).Should().Be((5, 5)); lca0.ChildOfLca(5, 6).Should().Be((5, 6)); lca0.ChildOfLca(5, 7).Should().Be((2, 1)); lca0.ChildOfLca(6, 0).Should().Be((2, 0)); lca0.ChildOfLca(6, 1).Should().Be((2, 1)); lca0.ChildOfLca(6, 2).Should().Be((6, 2)); lca0.ChildOfLca(6, 3).Should().Be((2, 1)); lca0.ChildOfLca(6, 4).Should().Be((2, 1)); lca0.ChildOfLca(6, 5).Should().Be((6, 5)); lca0.ChildOfLca(6, 6).Should().Be((6, 6)); lca0.ChildOfLca(6, 7).Should().Be((2, 1)); lca0.ChildOfLca(7, 0).Should().Be((1, 0)); lca0.ChildOfLca(7, 1).Should().Be((3, 1)); lca0.ChildOfLca(7, 2).Should().Be((1, 2)); lca0.ChildOfLca(7, 3).Should().Be((7, 3)); lca0.ChildOfLca(7, 4).Should().Be((3, 4)); lca0.ChildOfLca(7, 5).Should().Be((1, 2)); lca0.ChildOfLca(7, 6).Should().Be((1, 2)); lca0.ChildOfLca(7, 7).Should().Be((7, 7)); }