K番目の最小クリーク

K番目の最小クリーク

、、各ノードはそれ自身の量を有する、サブグラフを見つけ、すべての右ノード加算値が最初のk個の小さい地図がある(写真右が空グラフであり、第1小0:質問の意味)、そして但しサブグラフすなわち、任意の2つの隣接する点。

溶液:K == 1、答えがこのノード缶、kが1より大きいとき値アウトときトップは、まず、すべてのノードの、小さな重みにプライオリティキュー、優先キューの優先度を参加、0であります追加ポイントはプライオリティキューを導出しています。

難易度がポイントに隣接するほかは、ここで、あなたは、その後、ストレート・バイナリが動作の下で検索することができますBaiduのビットセットと呼ばれる非常に強力なものを使用するかどうかを確認する方法です。

#include<bits/stdc++.h>
using namespace std;
const int N = 107;
bitset<N> mp[N];
int n,k,value[N];
 
struct node{
    long long v;
    int pos;
    bitset<N> a;
    node(){}
    node(long long v,int pos,bitset<N> a){
        this->v = v;
        this->pos = pos;
        this->a = a;
    }
    bool operator<(const node &x)const{
        return v > x.v;
    }
};
 
void work(){
    priority_queue<node> q;
    for (int i = 1; i <= n;i++){
        q.push(node(1ll*value[i], i, mp[i]));
    }
    if(k==1){
        printf("0\n");
        return;
    }
    while(!q.empty()){
        node cd = q.top();
        q.pop();
        k--;
        if(k==1){
            printf("%lld\n", cd.v);
            return;
        }
        for (int i = cd.pos + 1; i <= n;i++){
            if(cd.a[i]){
                q.push(node(1ll * (cd.v + 1ll * value[i]), i, mp[i] & cd.a));
            }
        }
    }
    printf("-1\n");
}
 
int main(){
    int x;
    scanf("%d%d", &n,&k);
    for (int i = 1; i <= n;i++){
        scanf("%d" ,& value[i]);
    }
    for (int i = 1; i <= n; i++){
        for (int j = 1; j <= n; j++){
            scanf("%1d", &x);
            mp[i][j] = x;
        }
    }
    work();
}
公開された10元の記事 ウォンの賞賛1 ビュー174

おすすめ

転載: blog.csdn.net/weixin_45676038/article/details/104045005