コード例 #1
0
        public void FactoryTest_BuildBicupsidGraph()
        {
            var expected = new BicupsidGraph(
                new HashSet <int>(new[] { 1, 2 }),
                new HashSet <int>(new[] { 1, 2, 3 }),
                new[]
            {
                Tuple.Create(1, 1),
                Tuple.Create(1, 2),
                Tuple.Create(2, 1),
                Tuple.Create(2, 3),
            }
                );
            var actual = Factory.BuildBicupsidGraph(new StringReader(Test1));

            Assert.IsTrue(Equals(expected, actual));
        }
コード例 #2
0
        public static INetwork BuildOneThroughputNetwork(BicupsidGraph graph)
        {
            const int source        = 0;
            var       sink          = graph.VertexCount + 1;
            var       adjancecyList = graph.Edges
                                      .OrderBy(tuple => tuple.Item1)
                                      .GroupBy(tuple => tuple.Item1)
                                      .Select(tuples => tuples
                                              .Select(tuple => tuple.Item2 + graph.FirstFraction.Count)
                                              .ToArray())
                                      .ToList();

            adjancecyList.Insert(source, graph.FirstFraction
                                 .OrderBy(i => i)
                                 .ToArray());

            adjancecyList.AddRange(graph.SecondFraction.Select(vertex => new[] { sink }));
            adjancecyList.Add(new int[] {});

            return(new OneThroughputNetwork(adjancecyList.ToArray()));
        }
コード例 #3
0
        public static Tuple <bool, AdjList> IsFullMatchBicupsidGraph(BicupsidGraph graph)
        {
            AdjList result;

            if (graph.FirstFraction.Count != graph.SecondFraction.Count)
            {
                result = new AdjList(new[]
                {
                    Tuple.Create(graph.Edges.Min(tuple => tuple.Item1), 0)
                });
                return(Tuple.Create(false, result));
            }

            var network = Factory.BuildOneThroughputNetwork(graph);
            var maxFlow = MaxFlow(network);

            if (graph.FirstFraction.Count == maxFlow.Value)
            {
                result = graph.Edges
                         .Where(tuple =>
                                maxFlow.Edges.Contains(Tuple.Create(tuple.Item1, tuple.Item2 + graph.FirstFraction.Count)))
                         .ToList();
                return(Tuple.Create(true, result));
            }

            result = new AdjList();
            var item = graph.Edges
                       .GroupBy(tuple => tuple.Item1)
                       .First(tuples => tuples.All(
                                  tuple => maxFlow.Get(tuple.Item1, tuple.Item2 + graph.FirstFraction.Count) == 0)
                              ).Key;

            result.Add(Tuple.Create(item, 0));

            return(Tuple.Create(false, result));
        }
コード例 #4
0
 private bool Equals(BicupsidGraph first, BicupsidGraph second)
 {
     return(first.FirstFraction.SequenceEqual(second.FirstFraction) &&
            first.SecondFraction.SequenceEqual(second.SecondFraction) &&
            first.Edges.SequenceEqual(second.Edges));
 }