Example #1
0
        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(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 重み付きグラフ()
        {
            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);
        }
Example #4
0
        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(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)));
        }
Example #6
0
        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));
                }
            }
        }
Example #7
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.ToMFGraph();

            graph.Flow(0, 1).Should().Be(1);
            graph.Flow(0, 3).Should().Be(46);
        }
Example #8
0
        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, 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),
            });
        }
Example #10
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 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, 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 });
        }
Example #14
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.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 });
        }
Example #15
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)));
        }
Example #16
0
        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 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, 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));
        }
Example #20
0
        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));
        }