1 条题解
-
0
#include <bits/stdc++.h> using namespace std; bool g[22][22]; int n, m; long long f[1<<19][19], ans; int gg(int s, int p) { // 返回 s 的二进制数的第 p 位 return (s >> p) & 1; } int main() { cin >> n >> m; for (int i = 0; i < m; i++) { int u, v; cin >> u >> v; u--, v--; g[u][v] = g[v][u] = true; } for (int s = 1; s < (1<<n); s++) { int cnt = __builtin_popcount(s); int p = 0; while (!gg(s, p)) p++; // p 就是状态 s 的起点 if (cnt == 1) f[s][p] = 1; int st, ed; if (cnt == 1) st = ed = p; else st = p+1, ed = n-1; for (int i = st; i <= ed; i++) { // 状态 s 的终点是 i if (gg(s, i)) { // cnt>=3 p->..->i -?-> p if (cnt >= 3 && g[i][p]) ans += f[s][i]; // i->j for (int j = p+1; j < n; j++) { if (g[i][j] && !gg(s, j)) { int s2 = s ^ (1<<j); f[s2][j] += f[s][i]; } } } } } cout << ans / 2 << endl; return 0; }
- 1
信息
- ID
- 34
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- (无)
- 递交数
- 4
- 已通过
- 2
- 上传者