public void NotSimple()
        {
            var g = new MfGraphInt(2);

            g.AddEdge(0, 1, 1).Should().Be(0);
            g.AddEdge(0, 1, 2).Should().Be(1);
            g.AddEdge(0, 1, 3).Should().Be(2);
            g.AddEdge(0, 1, 4).Should().Be(3);
            g.AddEdge(0, 1, 5).Should().Be(4);
            g.AddEdge(0, 0, 6).Should().Be(5);
            g.AddEdge(1, 1, 7).Should().Be(6);
            g.Flow(0, 1).Should().Be(15);

            MfGraphInt.Edge e;
            e = new MfGraphInt.Edge(0, 1, 1, 1);
            g.GetEdge(0).Should().Be(e);
            e = new MfGraphInt.Edge(0, 1, 2, 2);
            g.GetEdge(1).Should().Be(e);
            e = new MfGraphInt.Edge(0, 1, 3, 3);
            g.GetEdge(2).Should().Be(e);
            e = new MfGraphInt.Edge(0, 1, 4, 4);
            g.GetEdge(3).Should().Be(e);
            e = new MfGraphInt.Edge(0, 1, 5, 5);
            g.GetEdge(4).Should().Be(e);

            g.MinCut(0).Should().Equal(new[] { true, false });
        }
        public void Simple()
        {
            var g = new MfGraphInt(4);

            g.AddEdge(0, 1, 1).Should().Be(0);
            g.AddEdge(0, 2, 1).Should().Be(1);
            g.AddEdge(1, 3, 1).Should().Be(2);
            g.AddEdge(2, 3, 1).Should().Be(3);
            g.AddEdge(1, 2, 1).Should().Be(4);
            g.Flow(0, 3).Should().Be(2);

            MfGraphInt.Edge e;
            e = new MfGraphInt.Edge(0, 1, 1, 1);
            g.GetEdge(0).Should().Be(e);
            e = new MfGraphInt.Edge(0, 2, 1, 1);
            g.GetEdge(1).Should().Be(e);
            e = new MfGraphInt.Edge(1, 3, 1, 1);
            g.GetEdge(2).Should().Be(e);
            e = new MfGraphInt.Edge(2, 3, 1, 1);
            g.GetEdge(3).Should().Be(e);
            e = new MfGraphInt.Edge(1, 2, 1, 0);
            g.GetEdge(4).Should().Be(e);

            g.MinCut(0).Should().Equal(new[] { true, false, false, false });
        }
        public void SelfLoop()
        {
            var g = new MfGraphInt(3);

            g.AddEdge(0, 0, 100).Should().Be(0);

            MfGraphInt.Edge e = new MfGraphInt.Edge(0, 0, 100, 0);
            g.GetEdge(0).Should().Be(e);
        }
        public void Cut()
        {
            var g = new MfGraphInt(3);

            g.AddEdge(0, 1, 2).Should().Be(0);
            g.AddEdge(1, 2, 1).Should().Be(1);
            g.Flow(0, 2).Should().Be(1);

            MfGraphInt.Edge e;
            e = new MfGraphInt.Edge(0, 1, 2, 1);
            g.GetEdge(0).Should().Be(e);
            e = new MfGraphInt.Edge(1, 2, 1, 1);
            g.GetEdge(1).Should().Be(e);


            g.MinCut(0).Should().Equal(new[] { true, true, false });
        }
        public void Twice()
        {
            var g = new MfGraphInt(3);

            g.AddEdge(0, 1, 1).Should().Be(0);
            g.AddEdge(0, 2, 1).Should().Be(1);
            g.AddEdge(1, 2, 1).Should().Be(2);
            g.Flow(0, 2).Should().Be(2);

            MfGraphInt.Edge e;


            e = new MfGraphInt.Edge(0, 1, 1, 1);
            g.GetEdge(0).Should().Be(e);
            e = new MfGraphInt.Edge(0, 2, 1, 1);
            g.GetEdge(1).Should().Be(e);
            e = new MfGraphInt.Edge(1, 2, 1, 1);
            g.GetEdge(2).Should().Be(e);

            g.ChangeEdge(0, 100, 10);
            e = new MfGraphInt.Edge(0, 1, 100, 10);
            g.GetEdge(0).Should().Be(e);

            g.Flow(0, 2).Should().Be(0);
            g.Flow(0, 1).Should().Be(90);

            e = new MfGraphInt.Edge(0, 1, 100, 100);
            g.GetEdge(0).Should().Be(e);
            e = new MfGraphInt.Edge(0, 2, 1, 1);
            g.GetEdge(1).Should().Be(e);
            e = new MfGraphInt.Edge(1, 2, 1, 1);
            g.GetEdge(2).Should().Be(e);

            g.Flow(2, 0).Should().Be(2);

            e = new MfGraphInt.Edge(0, 1, 100, 99);
            g.GetEdge(0).Should().Be(e);
            e = new MfGraphInt.Edge(0, 2, 1, 0);
            g.GetEdge(1).Should().Be(e);
            e = new MfGraphInt.Edge(1, 2, 1, 0);
            g.GetEdge(2).Should().Be(e);
        }
        public void Bound()
        {
            MfGraphInt.Edge e;

            const int INF = int.MaxValue;
            var       g   = new MfGraphInt(3);

            g.AddEdge(0, 1, INF).Should().Be(0);
            g.AddEdge(1, 0, INF).Should().Be(1);
            g.AddEdge(0, 2, INF).Should().Be(2);

            g.Flow(0, 2).Should().Be(INF);

            e = new MfGraphInt.Edge(0, 1, INF, 0);
            g.GetEdge(0).Should().Be(e);
            e = new MfGraphInt.Edge(1, 0, INF, 0);
            g.GetEdge(1).Should().Be(e);
            e = new MfGraphInt.Edge(0, 2, INF, INF);
            g.GetEdge(2).Should().Be(e);
        }