彩色数を求めるアルゴリズム
#彩色数を求めるアルゴリズム
https://kokiymgch.hatenablog.com/entry/2018/01/27/235959
code:cpp
int ChromaticNumber(const vector<vector<bool>> &tmpg) {
int n = tmpg.size();
if (n == 0) return 0;
vector<int> g(n);
for (int i = 0; i < n; i ++) {
for (int j = 0; j < n; j ++) {
if (tmpgij) {
gi |= (1 << j);
}
}
}
int all = 1 << n;
vector<int> a(all), s(all);
a0 = 1;
int modulo = 998244353;
for (int i = 1; i < all; i ++) {
int j = __builtin_ctz(i);
ai = ai - (1 << j) + a[(i - (1 << j)) & ~gj];
if (ai >= modulo) ai -= modulo;
}
for (int i = 0; i < all; i ++) {
si = ((n - __builtin_popcount(i)) & 1 ? -1 : 1);
}
for (int k = 1; k < n; k ++) {
long long sum = 0;
for (int i = 0; i < all; i ++) {
long long cur = ((si * (long long) ai) % modulo);
si = (int) cur;
sum += cur;
}
if (sum % modulo != 0) return k;
}
return n;
}
しくみ:
使用例
045 - Simple Grouping(★6)提出コード
vector<vector<bool>>には隣接リストが入っている。それを渡すことで、そのグラフの彩色数を求めることができる。