返回顶部

牛客编程巅峰赛S1第11场 - 黄金&钻石 B.新集合 (DFS)

  • 题意:有\([1,n]\)\(n\)个数,构造集合,集合中不能包含\(u\)\(v\),问最多能构造多少个集合.

  • 题解:被这题卡了一整场.....以为是推公式,结果答案是暴搜?

    ​ 首先我们先用一个二维数组标记一下所有\(u\)\(v\),然后从\(1\)开始搜,如果\(num>k\)就表示一种情况搜完了,首先考虑不选,深搜,然后再判断标记情况和小于\(num\)的数是否被选过,如果不满足就返回上一层,否则选当前这个数,标记,深搜,回溯即可.

  • 代码:

    /**
     * struct Point {
     *	int x;
     *	int y;
     * };
     */
    
    class Solution {
    public:
        /**
         * 返回新集合的种类数
         * @param n int整型 集合大小
         * @param m int整型 限制数量
         * @param limit Point类vector 不能同时出现的(u,v)集合
         * @return int整型
         */
        bool st[1000][1000];
        bool vis[1000010];
        int ans=0;
        
        void dfs(int num,int n){
            if(num>n){
                ans++;
                return;
            }
            dfs(num+1,n);
            
            for(int i=1;i<num;++i){
                if(vis[i] && st[i][num]) return;
            }
            vis[num]=true;
            dfs(num+1,n);
            vis[num]=false;
            return;
        }
        
        int solve(int n, int m, vector<Point>& limit) {
            // write code here
            for(int i=0;i<m;++i){
                st[limit[i].x][limit[i].y]=true;
                st[limit[i].y][limit[i].x]=true;
            }
            dfs(1,n);
            
            return ans;
        }
    };
    
posted @ 2020-08-14 01:01  _Kolibri  阅读(147)  评论(0)    收藏  举报