列表

详情


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

上一题