2019牛客暑期多校训练营(第二场)D Kth Minimum Clique(第k团)

题意:给你n个点 求第k小的团

思路:暴力bfs+bitset压位

#include <bits/stdc++.h>
using namespace std;
const int N = 1e5+7;
const int inf = 0x3f3f3f3f;
typedef long long ll;
typedef bitset<107> bs;
struct node{
    ll v;
    bs t;
    friend bool operator < (node a,node b){
        return a.v>b.v;
    }
};
int n,k;
ll w[107];
bs G[107];
void bfs(){
    priority_queue<node> q;
    bs t; t.reset();
    q.push((node){0,t});
    while(!q.empty()){
        node tmp=q.top();
        q.pop();
        k--;
        if(k==0){
            cout<<tmp.v<<endl;
            return ;
        }
        bs r=tmp.t;
        int po=0; for(int i=0;i<n;i++) if(r[i]) po=i+1;
        for(int i=po;i<n;i++){
            if(!r[i]&&((r&G[i])==r)){
                r[i]=1;
                node a=(node){tmp.v+w[i],r};
                q.push(a);
                r[i]=0;
            }
        }
    }
    cout<<"-1"<<endl;
    return ;
}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);
    cin>>n>>k;
    for(int i=0;i<n;i++){
        cin>>w[i];
    }
    for(int i=0;i<n;i++)
        for(int j=0;j<n;j++){
            char a; cin>>a;
            if(a=='1'){
                G[i][j]=1;
            }
        }
    bfs();
    return 0;
}

 

posted @ 2019-07-28 12:02  WAKBGAN  阅读(108)  评论(0编辑  收藏  举报