难度:α+
题目:??
这题要求我们用最少的颜色给一个图里的每个点染色,使相邻点颜色不同。
虽然我不知道正确的证明,但是很容易想到用贪心的方法做。
就是从一个点开始,染色,接着到一个相邻点,染色,接着继续下去。
这个做法可以 AC。
实现上面,用队列进行点的遍历。用数组记录该点可用的颜色。那么更新完一个点后需要把它相邻点的可取颜色集合去掉自己选过的。
1 while (!q.empty()) { 2 int v = q.front(); q.pop(); 3 k = max(k, (int)G[v].size()); // 题目要求一个点的最大度数 K 4 for (int c = 1; c <= n; c++) { // 枚举选择颜色 5 if (!valid[v][c]) continue; // 如果不能选这个颜色,继续枚举 6 color[v] = c; // 记录该点的颜色 7 col = max(col, c); // 颜色也要求一个最大值,之后要更新 K。因为 K >= Col 8 for (int i = 0; i < G[v].size(); i++) { // 更改相邻点的可取颜色 9 int u = G[v][i]; 10 valid[u][c] = 0; // 相邻点不可取 11 if (vis[u]) continue; // 如果在队里就不加入 12 q.push(u); vis[u] = 1; 13 } 14 break; // 选完颜色就可以进行到下一个点了 15 } 16 }
2018-02-07