リンク:https://ac.nowcoder.com/acm/contest/882/D
出典:牛オフネットワーク
無向グラフの頂点のサブセットは、クリーク場合にのみサブセット内の各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プロセスの最大のグループを見つけることです。