#include #include #include #include #include using namespace std; class Node{ public: std::vector nodes; std::vector edges; }; vector edges; vector nodes; int N,E; int getMinPssible(Node* current,Node* follow) { int minPossible = 1; for(int k = 1; k <= 301; k++){ for(int i = 0; i < current->edges.size(); i++){ if ( *(current->edges[i]) == k ){ goto next; } } for(int i = 0; i < follow->edges.size(); i++){ if ( *(follow->edges[i]) == k ){ goto next; } } minPossible = k; break; next: ; } return minPossible; } bool allLinksUsed(Node* node) { for(int i = 0; i < node->nodes.size(); i++){ if ( node->edges[i] == 0 ){ return false; } } return true; } int solve(Node* parent, Node* current) { int maxUsedColor = 0; for(int i = 0; i < current->nodes.size(); i++){ if ( current->nodes[i] != parent ){ int minPossible = getMinPssible(current, current->nodes[i]); *(current->edges[i]) = minPossible ; maxUsedColor = std::max(maxUsedColor, minPossible); if ( !allLinksUsed(current->nodes[i]) ){ maxUsedColor = std::max(maxUsedColor, solve(current, current->nodes[i])); } } } return maxUsedColor; } int main() { ifstream in("gcoloring.in"); in >> N; in >> E; nodes.resize(N+1); edges.resize(E); for(int i = 0; i < E; i++){ int A,B; in >> A >> B; edges[i] = 0; nodes[A].nodes.push_back(&nodes[B]); nodes[B].nodes.push_back(&nodes[A]); nodes[A].edges.push_back(&edges[i]); nodes[B].edges.push_back(&edges[i]); } int maxUsed = solve(0, &nodes[1]); ofstream out("gcoloring.out"); out << maxUsed << endl; for(int i = 0; i < edges.size(); i++){ out << edges[i] << endl; } return 0; }