fork download
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. typedef long long ll;
  6. typedef pair<int, int> ii;
  7.  
  8. const int INF = 1e9;
  9. const ll LINF = 1e18;
  10.  
  11. template<typename T>
  12. void minimize(T& a, const T& b) {
  13. if (b < a) a = b;
  14. }
  15.  
  16. int n, m;
  17. bool adj_mat[18][18];
  18.  
  19. int dp[1 << 18]; // dp[mask] = Số clique ít nhất có thể có khi xét các đỉnh có trong mask
  20.  
  21. int main() {
  22. ios::sync_with_stdio(false);
  23. cin.tie(nullptr);
  24. cin >> n >> m;
  25. for (int i = 0; i < m; i++) {
  26. int u, v;
  27. cin >> u >> v;
  28. --u; --v;
  29. adj_mat[u][v] = adj_mat[v][u] = 1;
  30. }
  31.  
  32. for (int mask = 0; mask < (1 << n); mask++) dp[mask] = INF;
  33.  
  34. // Trường hợp các đỉnh có trong mask là 1 clique
  35. for (int mask = 0; mask < (1 << n); mask++) {
  36. bool clique = true;
  37. for (int u = 0; u < n; u++) {
  38. if (!(mask & (1 << u))) continue;
  39. for (int v = 0; v < n; v++) {
  40. if (!(mask & (1 << v))) continue;
  41. if (v == u) continue;
  42. clique &= (adj_mat[u][v]);
  43. }
  44. }
  45. if (clique) dp[mask] = 1;
  46. }
  47.  
  48. // Trường hợp các đỉnh có trong mask được chia thành những clique có kích thước nhỏ hơn
  49. for (int mask = 0; mask < (1 << n); mask++) {
  50. for (int submask = mask; submask > 0; submask = (submask - 1) & mask) {
  51. minimize(dp[mask], dp[submask] + dp[mask ^ submask]);
  52. }
  53. } // O(3^n)
  54.  
  55. cout << dp[(1 << n) - 1] << '\n';
  56. }
Success #stdin #stdout 0s 5332KB
stdin
3 2
1 2
1 3
stdout
2