NC204418. 新集合
描述
现在牛妹给牛牛加了 个限制 ,每个限制包含两个整数 和 ( ),且 和 不能同时出现在新集合中 。
请问牛牛能组成的新集合多少种。
可以选 0 个数。
返回一个整数,即新集合的种类数。
输入描述
第一个参数为 。
第二个参数为 。
第三个参数为 对 (u, v) 。
示例1
输入:
3,2,[(1,2),(2,3)]
输出:
5
说明:
当 n = 3 时,共有 8 个子集,当加上限制 (1, 2), (2, 3) 后,合法的自己有 [], [1], [2], [3], [1, 3] 共 5 个C++11(clang++ 3.9) 解法, 执行用时: 6ms, 内存消耗: 380K, 提交时间: 2020-08-14 00:11:12
class Solution { public: int solve(int n, int m, vector<Point>& limit) { int len=1<<n; int rec[n+2]; for(int i=0; i<n; i++) rec[i]=0; for(Point p:limit) { rec[p.x-1]|=(1<<(p.y-1)); rec[p.y-1]|=(1<<(p.x-1)); } int res=0; for(int i=0; i<len; i++) { bool flag=false; for(int j=0; j<n; j++) if((1<<j)&i) { if(rec[j]&i) { flag=true; break; } } if(!flag) res++; } return res; } };
Go(1.14.4) 解法, 执行用时: 5ms, 内存消耗: 932K, 提交时间: 2020-08-13 22:52:10
package main import . "nc_tools" // github.com/EndlessCheng/codeforces-go func solve(n, _ int, ps []*Point) int { iv := [21][21]bool{} for _, p := range ps { iv[p.X][p.Y] = true iv[p.Y][p.X] = true } cnt := 0 a := []int{} var f func(int) f = func(p int) { if p == n+1 { cnt++ return } f(p + 1) for _, v := range a { if iv[v][p] { return } } a = append(a, p) f(p + 1) a = a[:len(a)-1] } f(1) return cnt }
Python3(3.5.2) 解法, 执行用时: 1506ms, 内存消耗: 6520K, 提交时间: 2020-08-14 01:47:25
class Solution: def solve(self, n, m, limit): self.res=0 def dfs(s,c): if c==n: for k in limit: i,j=k.x-1,k.y-1 if 1<<i&s != 0 and 1<<j&s!=0: return self.res+=1 return dfs(s,c+1) dfs(s|1<<c,c+1) dfs(0,0) return self.res