2019頭の牛のオフより学校2番目のフィールドK番目の最小クリーク

 

タイトル説明

N個の頂点を持つ頂点重み付けグラフが与えられると、K番目の最小加重クリークを見つけます。

無向グラフの頂点のサブセットは、クリーク場合にのみサブセット内の各2つの別個の頂点が隣接している場合に呼び出されます。クリークの重量は、その中の頂点の重みの合計です。

説明を入力します。

入力の最初の行はN、Kは2スペースで区切られた整数を含む
入力の2行目は、N個のスペースで区切られた整数を含むwはiは、各頂点の重みを表すWI。
N行に続いて、それぞれに含まれるN個の文字E I J EIJ。頂点iと頂点jの場合に限り、間にエッジがあります電子のIのJ = 「1」EIJ =「1」が。

1 N 100
1 K ≤の1E6
0 W iが1E9の
E iがJ "01"
、E 、I 、Iを= "0"
のE のi J = 電子のj個のI

出力説明:

答えを表す整数を含む出力1行。Kのクリーク、出力未満があります場合は「-1」「-1」。

例1

エントリー

コピー
2 3 
1 2 
01 
10

輸出

コピー
2

説明

空集合はクリークと考えられています。

質問の意味:

  Kは、重みの小グループを見つけます。

分析:

  まず、最小のグループが空のセットでなければなりません。

  空集合の添加の点では、n個の新しいセットを得ることができます。その後、徐々にn個の点のセットに追加し、新しいコレクションを取得することができます。

  その後、我々は、値の右のセットが徐々に大きくなっていることを確認するために、少しずつ追加することができます。

  たびに、私たちは、重みの既存のセットのすべてから、最小限のアップデートを開始し、そのプライオリティキューを使用することができます。

  この点によれば、徐々にKの小集団を与えるために添加することができるが、そこに繰り返すことができる、または欠落し、次いで基準電流設定点プラス最大点が欠落して重複しません。

  完全部分グラフは、完全部分グラフを保存することができBITSET、プライオリティキューに格納されます。

  

///   著者:Kissheart   ///
する#include <stdio.hに> 
する#include <アルゴリズム> 
書式#include <iostreamの> 
書式#include < 文字列の.h> 
の#include <ベクトル> 
書式#include <stdlib.h>に含ま
する#include <数学。 H> 
の#include <キュー> 
の#include <両端キュー> 
の#include <のctype.h> 
の#include <地図> 
の#include <ビットセット> 
の#include < セット > 
の#include <スタック> 
の#include < ストリング >
#define INF 0x3f3f3f3f
 の#defineFAST_IO IOS :: sync_with_stdio(偽)
 のconst  ダブル PI = ACOS( - 1.0 )。
constの ダブル EPS = 1E- 6 const  int型 MAX = 1E5 + 10 const  int型 MOD = 1E9 + 7 
typedefの長い 長いLL。
使用して 名前空間はstdを、
#define GCD(a、b)は__gcd(a、b)は
インラインLLのLCM(-1,11,11- b)は{ 返す / GCD(a、b)は* ; B}を
{LL(-1,11,11- b)はインラインのLL qpowをR = 1、T = A。一方、(b)は、{ もし、(B&1)、R =(R * T)%MOD; B >> = 1 ; T =(T * T)%のMOD;} 戻りR;} 
インラインのLL INV1(LL B){ 戻り qpow(B、mod- 2 )。 } 
(LLのB -1,11,11-インラインのLL exgcd&X、LL&Y){ 場合(B!){X = 1 ; Yは= 0 ; 戻り } LL R = exgcd(B、%のB、Y、X); Y - =(/ B)* X。戻りRを;} 
インラインLLリード(){LL、X = 0、F = 1チャー C = GETCHAR()。(;!isdigit(C)と、c = getchar関数())の場合(C == ' - ')は、f = - 1 ; にとって(; isdigit(C); C = GETCHAR())X = X * 10 + C- ' 0 '戻りのx *のF;}
 // freopenは( "in.txt"、 "R"、STDIN)。
// freopenは( "data.txtを"、 "W"、STDOUT)。
int型N、K。
INT [ 105 ]。
ビット集合 < 105 >ビット[ 105 ]。
構造体ノード
{ 
    ビット集合 < 105 > 今。
    ヴァルLL; 
    int型最後;
    ブール 演算子 <(constのノード&A)のconst 
    {
        返す値> a.valを。
    } 
}。

LL get_ans()
{ 
    PRIORITY_QUEUE <ノード> Q。
    ノードがありません。
    no.now.reset(); 
    no.val = 0 ; 
    no.last = 0 ; 
    q.push(NO)。

    一方、(!q.empty())
    { 
        なし = q.top()。
        q.pop(); 

        もし(--k == 0 を返すno.val。

        INT iが++; iがn <I = no.last 
        { 
            もし(!no.now [I] &&((no.now&ビット[I])== no.now))
            { 
                no.now。セット(I); 
                q.push(ノード{no.now、no.val + [i]は、I + 1 })。
                no.now.reset(I); 
            } 
        } 
    } 
    リターン - 1 
} 
int型のmain()
{ 
    scanf関数(" %D%dの"、&​​N&K)。
    以下のためにint型私= 0 ; iがN <; I ++)はscanf関数(" %のD "、および[I])。
    以下のためのint型i = 0 ; iがN <; Iは++ 
    { 
        ためINT J = 0 ; J <nであり、j ++ 
        { 
            int型のX; 
            scanf関数(" %の1D "、およびX)
            ビット[i]を。セット(J、X)。
        } 
    } 
    のprintf(" %LLDする\ n " 、get_ans())。
    リターン 0 ; 
}
コードの表示

 

 

 

おすすめ

転載: www.cnblogs.com/Kissheart/p/11224908.html