src/demo/coloring.cc
author deba
Sat, 14 May 2005 17:40:45 +0000
changeset 1422 469b3f628dd1
permissions -rw-r--r--
Six-coloring in plan graphs.
     1 #include <vector>
     2 
     3 #include <lemon/smart_graph.h>
     4 #include <lemon/bin_heap.h>
     5 #include <lemon/graph_reader.h>
     6 #include <lemon/graph_to_eps.h>
     7 
     8 using namespace std;
     9 using namespace lemon;
    10 
    11 int main() {
    12   typedef UndirSmartGraph Graph;
    13   typedef Graph::Node Node;
    14   typedef Graph::NodeIt NodeIt;
    15   typedef Graph::UndirEdge UndirEdge;
    16   typedef Graph::IncEdgeIt IncEdgeIt;
    17 
    18   Graph graph;
    19 
    20   UndirGraphReader<Graph> reader(std::cin, graph);
    21   Graph::NodeMap<xy<double> > coords(graph);
    22   reader.readNodeMap("coords", coords);
    23   
    24   reader.run();
    25 
    26   Graph::NodeMap<int> color(graph, -2);
    27   
    28   Graph::NodeMap<int> heapMap(graph, -1);
    29   BinHeap<Node, int, Graph::NodeMap<int> > heap(heapMap);
    30   
    31   for (NodeIt it(graph); it != INVALID; ++it) {
    32     heap.push(it, countOutEdges(graph, it));
    33   }
    34 
    35   vector<Node> order;
    36 
    37   while (!heap.empty()) {
    38     Node node = heap.top();
    39     heap.pop();
    40     color[node] = -1;
    41     order.push_back(node);
    42     for (IncEdgeIt it(graph, node); it != INVALID; ++it) {
    43       Node target = graph.runningNode(it); 
    44       if (color[target] == -2) {
    45 	heap.decrease(target, heap[target] - 1);
    46       }
    47     }
    48   }
    49 
    50   for (int i = order.size() - 1; i >= 0; --i) {
    51     set<int> forbidden;
    52     for (IncEdgeIt it(graph, order[i]); it != INVALID; ++it) {
    53       Node target = graph.runningNode(it); 
    54       if (color[target] != -1) {
    55 	forbidden.insert(color[target]);
    56       }
    57     }
    58     int current = 0;
    59     while (forbidden.find(current) != forbidden.end()) ++current;
    60     color[order[i]] = current;
    61   }
    62 
    63   ColorSet colorSet;
    64 
    65   graphToEps(graph, "six_coloring.eps").
    66     title("Six Colored Graph").copyright("(C) 2005 LEMON Project").
    67     coords(coords).nodeColors(composeMap(colorSet, color)).
    68     scaleToA4().run();
    69 
    70   return 0;
    71 }