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)); }
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())); }
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)); }
private bool Equals(BicupsidGraph first, BicupsidGraph second) { return(first.FirstFraction.SequenceEqual(second.FirstFraction) && first.SecondFraction.SequenceEqual(second.SecondFraction) && first.Edges.SequenceEqual(second.Edges)); }