| Run ID | 作者 | 问题 | 语言 | 测评结果 | 时间 | 内存 | 代码长度 | 提交时间 |
|---|---|---|---|---|---|---|---|---|
| 91374 | sh25_zhoumy | 「ZJOI2015」地震后的幻想乡 | C++ | 通过 | 2 MS | 932 KB | 856 | 2026-06-12 15:37:54 |
#include <algorithm> #include <cstdio> #include <cstring> const int N = 10; const int M = 45 + 1; bool vis[1 << N][M]; int siz[1 << N], link[N]; double f[1 << N][M]; int main() { int n, m; scanf("%d%d", &n, &m); int lim = 1 << n; for (int i = 0, x, y; i < m; ++i) { scanf("%d%d", &x, &y); --x; --y; link[x] |= (1 << y); link[y] |= (1 << x); } for (int S = 1; S < lim; ++S) siz[S] = siz[S & (S - 1)] + 1; for (int S1 = 3; S1 < lim; ++S1) if (S1 & 1) { for (int S2 = (S1 - 1) & S1; S2 != 0; S2 = (S2 - 1) & S1) if (S2 & 1) { int T = 0; for (int i = 0; i < n; ++i) if ((S1 >> i) & (~S2 >> i) & 1) T += siz[link[i] & S2]; for (int i = 0; i + T <= m; ++i) f[S1][i] += 1.0 / (i + T + 1) - f[S2][i + T]; } } printf("%.6lf\n", f[lim - 1][0]); return 0; }