http://acm.pku.edu.cn/JudgeOnline/problem?id=1129
Код:
#include <iostream> #include <stdio.h> using namespace std; const int MAXN = 30; int n, ok, c[MAXN], data[MAXN][MAXN]; int check(int x){ for (int i = 1; i <= n; ++i){ if ((data[x][i] && c[i] != c[x]) || (!data[x][i])) continue; return 0; } return 1; } void search(int id, int color){ if (id == n + 1){ ok = 1; return; } if (ok) return; for (int i = 1; i != color + 1; ++i){ c[id] = i; if (check(id)) search(id + 1, color); } c[id] = 0; } int main(){ char ch, tch; int x, y; while (cin >> n && n != 0){ tch = getchar(); memset(data, 0, sizeof(data)); for (int i = 0; i != n; ++i){ ch = getchar(); x = ch - 'A' + 1; tch = getchar(); while (ch = getchar()){ if (ch < 'A') break; y = ch - 'A' + 1; data[x][y] = data[y][x] = 1; } } for (int i = 1; i <= 4; ++i){ memset(c, 0, sizeof(c)); ok = 0; search(1, i); if (ok){ if (i == 1) cout << "1 channel needed." << endl; else cout << i << " channels needed." << endl; break; } } } return 0; }