1 条题解

  • 0
    @ 2024-9-19 20:31:13
    #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
    上传者