标签: 弦图
有关弦图的定义与mcs算法请自学(模板)
题意为求弦图的色数\(\chi(G)\)
做法:
最优染色构造:将完美消除序列从后往前依次给每个点染色,给每个点染上可染的最小颜色
证明:
设以上方法用\(col\)个颜色,原图团数为\(\omega(G)\)
引理:\(\omega(G) \leq \chi(G)\)
引理证明:对最大团的导出子图染色,至少需要\(\omega(G)\)种颜色(因为团中每个点都相邻,每个点都需用不同的颜色)
设\(col \geq \chi(G)\)
团上每个点都不同\(\rightarrow col = \omega(G)\)
由引理:\(col = \omega(G) \leq \chi(G)\),\(col \geq \chi(G)\)
$\therefore t = \omega(G) =\chi(G) $
\(ans = max\{|\{x\} + N(x)|\} = max\{lab_i\} + 1\)
代码: 要开O2优化
#include <iostream> #include <cstdio> using namespace std; const int N = 1e4 + 1; int n, m, u, v, lab[N], p[N]; bool c[N][N], vis[N]; inline void mcs() { for (int i = n; i >= 1; --i) { u = 0; for (int j = 1; j <= n; ++j) if (!vis[j] && (!u || lab[j] > lab[u])) u = j; vis[u] = 1; p[i] = u; for (int j = 1; j <= n; ++j) if (!vis[j] && c[u][j]) ++lab[j]; } } int main() { ios::sync_with_stdio(false); cin >> n >> m; for (int i = 1; i <= m; ++i) { cin >> u >> v; c[u][v] = c[v][u] = 1; } mcs(); int ans = 0; for (int i = 1; i <= n; ++i) ans = max(ans, lab[i] + 1); cout << ans << endl; return 0; }