static IEnumerable <Choosability.Graph> EnumerateWeightings(Choosability.Graph g) { var space = Not ? g.Vertices.Select(v => Enumerable.Range(0, Spread)).CartesianProduct() : g.Vertices.Select(v => Enumerable.Range(0, Spread).Reverse()).CartesianProduct(); foreach (var weighting in space) { var www = weighting.ToList(); if (www.Count(w => w > 0) > MaxHighs) { continue; } if (g.Vertices.Any(v => g.Degree(v) - www[v] <= 1)) { continue; } if (LowMinDegree > 0) { var low = www.IndicesWhere(w => w == 0).ToList(); if (g.InducedSubgraph(low).MinDegree < LowMinDegree) { continue; } } var gg = g.Clone(); gg.VertexWeight = www; yield return(gg); } }
static void Main(string[] args) { var vertices = Enumerable.Range(1, N).Select(i => new Fraction() { Top = (int)f((uint)i), Bottom = (int)f((uint)i + 1) }).ToList(); // var vertices = new FareySequence(N).ToList(); var adjacent = new bool[vertices.Count, vertices.Count]; for (int i = 0; i < vertices.Count; i++) { for (int j = 0; j < vertices.Count; j++) { adjacent[i, j] = adjacent[j, i] = Math.Abs(vertices[i].Top * vertices[j].Bottom - vertices[i].Bottom * vertices[j].Top) == 1.0; } } //var g = new Choosability.Graph(adjacent); //var R = g.Vertices; //var G = g.Vertices.Except(g.Vertices).ToList(); List <int> R = null; List <int> G = null; var g = new Choosability.Graph(adjacent); foreach (var red in g.EnumerateMaximalIndependentSets()) { var bluegreen = g.Vertices.Except(red).ToList(); var h = g.InducedSubgraph(bluegreen); if (!h.IsTwoColorableSlow()) { continue; } R = red; foreach (var green in g.EnumerateMaximalIndependentSets(bluegreen)) { if (g.EdgesOn(bluegreen.Except(green).ToList()) <= 0) { G = green; break; } } if (G != null) { break; } } var B = g.Vertices.Except(R).Except(G).ToList(); using (var sw = new StreamWriter("Ford" + N + ".tex")) { sw.WriteLine(@"\documentclass{standalone}"); sw.WriteLine(@"\usepackage{tikz}"); sw.WriteLine(@"\begin{document}"); sw.WriteLine(@"\begin{tikzpicture}"); var circles = string.Join(Environment.NewLine, Enumerable.Range(1, N).Select(i => new Fraction() { Top = (int)f((uint)i), Bottom = (int)f((uint)i + 1) }).Select(f => new FordCircle(f)).Select((f, i) => string.Format(@"\fill[{3}] ({0},{1}) circle [radius={2}];", f.X, f.Y, f.R, Fill(f.F, i, R, G)))); sw.WriteLine(circles); sw.WriteLine(@"\end{tikzpicture}"); sw.WriteLine(@"\end{document}"); //var k = g.CliqueNumberBronKerbosch(); //var gg = GraphIO.GraphFromEdgeWeightString(string.Join(" ", g.GetEdgeWeights())); //var s = CompactSerializer.Serialize(gg); } }