オフネットワーク牛マルチ学校の研修2番目のフィールドD K番目の最小クリーク

リンク:https://ac.nowcoder.com/acm/contest/882/D
出典:牛オフネットワーク

 

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

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

 

質問の意味:ノーカラーアクセスマップの行列が与えられると、各点は正しい値を有し、k個の重みの小さいグループの値(完全部分グラフであるグループ)を見つけるために右

問題解決のアイデア:もちろん、私たちは最も小さいグループが空完全グラフであることを知ることができ、それは、0次の完全部分グラフで、このようにインスピレーションを得た、私たちはこの第2小最小グループ、小さな三から生成することができます...第2小、小...第三のグループが生成され、空のスポットに参加するグループであるため、グループは、ここでの考え方は明らかに幅優先探索の一種であります

しかし、どのように私たちが行うには小さなN + 1の順に、n個の小グループに従っている各チームの外に作るのですか?右の各ポイントの値に、そのグループの大きさ、重量の数や大きさの点ではなく、ポイントのため、この場所として定義されているので、明らかに、我々は、プライオリティキューの実装を使用します

グループの順序を保証する優先度キューの小グループは、新たなグループを形成する各グループが大きくなるため、昇順、降順でグループをデキューし、そうであるスタックの最上位n番目デキューグループは、BFSは、我々は最初のk小グループを取得することができ、このプロセスをシミュレートし、最初のn個の小グループである必要があります。

PS:各グループとの接続点の全ての点で表されるタイトルビットセット、最適化します

= N; J ++){
            scanf関数( "%の1D"、およびX)
                next.clique = now.clique。
            STA [I] [J] = xと; 
        } 
    LL ANS = -1。
    ノードST; 
    st.id = 0; 
    st.w = 0; 
    q.push(ST); 
    (!q.empty())、一方
    { 
        ノード今= q.top()。
        q.pop(); 
        k--; 
        (!K)であれば
        { 
            ANS = now.w。
            ブレーク; 
        } 
        ため(INT I = now.id + 1; I <= N; iは++)
        { 
            IF((now.clique&STA [I])== now.clique)//说明点I与当前团中的点都相连
            { 
                次のノード。
                next.id = I; 
                next.clique [I] = 1。
                next.w = now.w +ヴァル[I]。
                q.push(次)
            } 
        } 
    } 
    COUT << ANS << ENDL。
    0を返します。
}

 

概要:質問の本質は最初のk小グループを取得し、中に取得するにはプライオリティキューを維持するために、グループによって解析されたDFSプロセスの最大のグループを見つけることです。

おすすめ

転載: www.cnblogs.com/xusirui/p/11221952.html