Exemple #1
0
        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);
            }
        }
Exemple #2
0
        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);
            }
        }