예제 #1
0
        public static bool colorBFS(Node n)
        {
            Color colorToPaint; //Actual color to paint.
            Stack<Node> s = new Stack<Node>();
            if(n.color == Color.None)
                n.color = Color.Blue;
            s.Push(n);
            while (s.Count != 0) {
                Node parent = s.Pop();
                if (parent.check)
                    continue;
                count++;//keep track of the number of operations done (Testing purposes).
                parent.check = true;
                if (parent.color == Color.Red)
                    colorToPaint = Color.Blue;
                else
                    colorToPaint = Color.Red;

                bool isImportant = false;

                for (int i = 0; i < parent.children.Count; i++) {
                    Node child = parent.children[i];
                    isImportant = true;
                    if (child.color == parent.color)
                        return false;

                    if (child.color == Color.None) {
                        child.importantRelation = true;
                        child.color = colorToPaint;
                        s.Push(child);
                    }
                }
                if (!parent.importantRelation)
                    parent.importantRelation = isImportant;

            }

            return true;
        }
예제 #2
0
        static void Main(string[] args)
        {
            List<Node> tree = new List<Node>();
            String[] nums;
            nums = Console.ReadLine().Split(' ');
            int elems = Convert.ToInt32(nums[0]),restrictions = Convert.ToInt32(nums[1]);
            for (int i = 0; i < elems; i++) {
                Node n = new Node(i + 1);
                tree.Add(n);
            }

            for (int i = 0; i < restrictions; i++)
            {
                String[] r = Console.ReadLine().Split(' ');
                int a = Convert.ToInt32(r[0]), b = Convert.ToInt32(r[1]);
                tree[a - 1].children.Add(tree[b - 1]); //Add to children. Make a directed graph.
            }
            //Since the graph is not fully connected, better make sure to paint all nodes.
            for (int i = 0; i < tree.Count; i++) {
                if (!colorBFS(tree[i])) {
                    Console.WriteLine("No solution found...");
                    return;
                }
            }

            //Print blue ones:
            List<Node> Blues = new List<Node>(), Reds = new List<Node>(),notImportant = new List<Node>();
            //
            for (int i = 0; i < tree.Count; i++)
            {
                Node n = tree[i];
                if (n.importantRelation)
                {
                    if (n.color == Color.Blue)
                        Blues.Add(n);
                    else
                        Reds.Add(n);

                }
                else
                    notImportant.Add(n); //Not important elements are used to play around after important ones have been distributed.
            }

            for (int i = 0; i < notImportant.Count; i++) {
                Node n = notImportant[i];
                if (Blues.Count < Reds.Count)
                    Blues.Add(n);
                else
                    Reds.Add(n);
            }

            //Sort blues and Reds.
            Blues.Sort(delegate (Node n1, Node n2) { return n1.value.CompareTo(n2.value); });
            Reds.Sort(delegate (Node n1, Node n2) { return n1.value.CompareTo(n2.value); });
            Console.WriteLine(Blues.Count);
            for (int i = 0; i < Blues.Count; i++)
            {
                Node n = Blues[i];
                Console.Write(n.value + " ");
            }
            Console.WriteLine();
            Console.WriteLine(Reds.Count);
            for (int i = 0; i < Reds.Count; i++)
            {
                Node n = Reds[i];
                Console.Write(n.value + " ");
            }
            Console.WriteLine();
            //Console.WriteLine("Number of ops: " + count);
            Console.Read();
        }