[BZOJ-1006&羅区P3196] [HNOI2008]素晴らしい国 - [カラーリング - 最大の潜在的MCSアルゴリズム]

羅区:制限時間1.00s メモリ制限の125.00メガバイト

制限時間:20秒   メモリ制限:162メガバイト

トピックリンク:https://www.lydsy.com/JudgeOnline/problem.php?id=1006

羅区:https://www.luogu.com.cn/problem/P3196

説明

  Kステートは、鋭い三角形の国でも人々の交流、彼らはその三角形信じるだけの愛の三角原理である。すなわちAB相互理解を、BCは、CAがお互いを知っている
。お互いを知って、三角関係を強化するために、シンプルかつ効率的であり、Kステートは禁止されています関係の4辺、5辺関係いわゆるN両面関係の存在は、N個の個別A1A2を指す
(A1A2)(A2A3)...:との関係を理解するだけの間...アンNが存在 (ANA1)、 およびなしのこのよう四辺関係などの関係の理解は4 ABCD AB、BC、Cを意味し
、お互いを知っているD、DA、およびゲームはすべての人々が、不正行為を防止するために、人々の任意のペアの規定は、チームでお互いを知ることができない場合は、AC、BDは知りません王は、位相を知って、
剥離の最小数を分割することができます。

入力

  二つの整数N、Mの最初の行 1 <= N <= 10000,1 < = M <= 1000000 Nは入力点の各対M次にM線との間の関係を理解し、個人を表現
友達

出力

  出力整数、チームの最小数を分割することができます

サンプル入力

4 5
1 2
1 4
2 4
2 3
3 4

サンプル出力

3

ヒント

  溶液(3)(2)(4)


 

emmm、ノウハウを見るためにマップを描画することは、少なくとも、あなたが使用することができますどのように多くの色を尋ね、グラフ彩色、隣接するドットでない同じ色のために、グラフの最小限の着色を必要とすることです。

ここでの最大の潜在的なアルゴリズムだ次のように、具体的なプロセスは次のとおりです。

各点電位の1始まりは0である、任意のアウトポイントが削除されました。

2. 1点の電位との結合点を削除し、最大電位点の削除を削除。

3.すべてのポイントが削除されるまで2を繰り返します。

だから、削除された配列であること、そしてこのシーケンスは異なる可能性の番号を削除登場しますが、色の最小数はどのくらいです。

第二のテストポイント羅バレーでは、その後の時間に巻き込ま、BZOJない問題のような酸素の最適化を開きます。

以下は、ACコードです:

書式#include <cstdioを> 
する#include <CStringの> 
の#include <キュー> 
の#include <アルゴリズム>
 使用して 名前空間をSTD。

const  int型 MAC = 1E6 + 10 const  int型 MAC2 = 1E4 + 10 

構造体ノード
{ 
    int型に、次の、W。
}例えば、[MAC << 1 ]。
INTヘッド[MAC2]、CNT = 0 、VIS [MAC2]、色[MAC2]、ポイント[MAC2]。
構造体ポット
{ 
    int型のVal、ID。
    ブール 演算子 <(constのポット&)CONST {
         リターンヴァル< a.val。
    } 
}。

ボイド追加(INT U、INT V)
{ 
    例えば、[ ++ CNT] =ノード{V、ヘッド[U]、0 }。
    ヘッド[U] = CNT。
} 

int型のmain()
{ 
    int型N、M。
    scanf関数(" %D%D "、&​​N、&M)。
    memsetの(頭、 - 1はsizeof ヘッド)
    INT iは= 1 ; I <= M I ++ ){
         int型U、V; 
        scanf関数(" %D%D "、&​​U&V); 
        (V、U)を追加し、追加(V、U); 
    } 
    PRIORITY_QUEUE <ポット> Q。
    q.push(ポット{ 01 })。
    int型 ANS = 0 ;
    しばらく(!q.empty()){ 
        ポットになりました = q.top(); 
        q.pop(); 
        もし(VIS [now.id])続けます
        VIS [now.id] = 1 int型のu = now.id。
        もし(!色[now.val])ANS ++、色[now.val] =1 ;
        以下のためにINT iがヘッド= [U]; I =! - 1 ; I = 例えば、[I] .next){
             int型 V = 例えば、[I] .TO。
            場合(VIS [V])続けます
            ポイント[V] ++ ; 
            q.push(ポット{点[V]、V})。
        } 
    } 
    のprintf(" %dの\ n " 、ANS)。
    リターン 0 ; 
}

 

 

 

おすすめ

転載: www.cnblogs.com/lonely-wind-/p/12191171.html