2019牛客暑期多校訓練營(第二場)----D-Kth Minimum Clique

首先發出題目鏈接:
鏈接:https://ac.nowcoder.com/acm/contest/882/D
來源:牛客網
涉及:優先隊列,bitset

點擊這裏回到2019牛客暑期多校訓練營解題—目錄貼


題目如下:
在這裏插入圖片描述
在這裏插入圖片描述
代碼如下:

#include <iostream>
#include <bitset>
#include <queue>
using namespace std;
typedef long long ll;
typedef bitset<105> BIT;
struct P{
    ll data;
    BIT bits;
    int index;
    bool operator<(const P &a) const{
        return this->data>a.data;
    }
    P(ll da,BIT bi,int in){
        this->data=da;
        this->bits=bi;
        this->index=in;
    }
};
BIT bit[105];
int n,k;
ll w[105];
priority_queue<P> que;
inline int read(){
    int x=0,w=1;char ch=getchar();
    while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
    if(ch=='-')w=0,ch=getchar();
    while(ch>='0'&&ch<='9')x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
    return w?x:-x;
}
int main(){
    cin>>n>>k;
    int i,j,t;
    for(i=1;i<=n;i++)    w[i]=read();
    for(i=1;i<=n;i++){
        for(j=1;j<=n;j++){
            scanf("%1d",&t);
            bit[i][j]=t;
        }
    }  
    que.push(P(0,0,0));
    while(!que.empty()){
        P p=que.top();
        que.pop();
        if(k==1)    return !printf("%lld",p.data);
        else k--;
        for(i=p.index+1;i<=n;i++)
            if((p.bits&bit[i])==p.bits){
                BIT x=p.bits;
                x[i]=1;
                que.push(P(p.data+w[i],x,i));
            }  
    }
    return !printf("-1");
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章