トピック出典:羅区
タイトル説明
昔、はるか遠くの銀河で、その超兵器に対する暗い帝国は銀河を支配しました。
ある日、偶然の機会で、反乱軍は帝国の武器、そしてほぼすべての銀河の惑星のキャプチャを破壊しました。これらの惑星は、直接または間接的に特別なイーサネットトンネルにより相互に接続されています。
しかし、それは長くは続かなかった、とすぐに帝国は再び彼のスーパーの武器を作成します。このスーパー武器の力で、帝国は惑星反乱軍占領の体系的な破壊を開始しました。惑星が破壊され続けているので、2つの惑星間の通信チャネルは、信頼性の低いアップを開始しました。
さて、反乱軍のリーダーはあなたに仕事を与える:反政府勢力は、通信ブロックの惑星を占領した後、すぐにすべての打撃を見つけようとするオリジナルの2つの惑星間の帝国のオーダーに対してイーサネット接続トンネルや惑星を与えます番号。(2つの惑星は、既存のイーサネットチャネルを介して直接または間接的に通信することができる場合、同じ通信ブロック内の2つの惑星)。
入出力フォーマット
入力フォーマット:
入力ファイルの最初の行は、2つの整数を含まN (1 < = N < = 2 M)及び M (1 < = M < = 2 0 0 、0 0 0)は、それぞれ、及びトンネル遊星エーテル図の数。惑星 0〜 N. 1 - 整数。
次の M行、二つの整数含む各行 X、 Yを( 0 < = X- < > Yは、遊星表す XのX惑星および yは「エーテル」Yトンネル、直接通信を有しています。
次に、整数の挙動 攻撃惑星の数を表すK、。
次 のk 行は、各行がターゲット軍を順に、整数値を有します。この k個の 互いに異なるとされている多数の 0 まで のn- - 1範囲。
出力フォーマット:
最初の行は、地球の先頭で通信ブロックの数です。次 のK 行は、通信回数を表す各整数は、既存の惑星の後のブロックを打ちます。
サンプル入力と出力
説明
[JSOI2008]
この質問は、設定する必要が互いに素とグラフ理論の深い理解、強制的思考テストコードです。
解像度:
我々はトピックに応じた意味を理解している場合、この質問を参照してください、あなたは簡単に互いに素設定ビルド限り、アイデアを得ることができ、ユニコムはそれをブロックし維持します。
しかし、質問の意味は、我々は削除する、そこからポイントして、各ブロックの削除終了点の後に中国聯通の数をカウントします。
これは非常に非常に大きな頭、私たちが知っている、互いに素セット互いに素セット、どのようにこれはナ行うことができますが、合併困難を削除するのは簡単ですか!
はい、あなたは削除よりも合併容易にするので、その後、私たちは考えて、逆のソリューションを逆にしたい場合があり、考えを持っているかもしれません。
:私たちは、件名を少し変更する、のは「反乱再建計画」qwqまあそれを呼びましょう
攻撃が計画を再構築開始する前に長い時間前に、遠く離れた銀河では、反乱軍は、帝国軍の損失を補うために。
それぞれが反乱軍によって占め惑星を再構築し終えた後、すぐに惑星を探すために、星や他の惑星との間のすべてのイーサネットトンネルの再構築と復興計画する惑星を与えるために:今、反乱軍のリーダーはあなたに仕事を与えますブロックの数を伝えます。(2つの惑星は、既存のイーサネットチャネルを介して直接または間接的に通信することができる場合、同じ通信ブロック内の2つの惑星)。
ねえ、これははるかに簡単ではないのですか?そして、ちょうどオリジナルのタイトルで、順番に、解決策はまた、逆の順序で起こり得ました。
アイデアは、各惑星の後に再建され、今でも同じであり、地球と惑星ユニコムは、この質問が完了し、中にマージし、ピントを確認する予定です。
しかし、ポイントは、隣接テーブルの上に、ここで言及します。この問題では、我々は確かに無向グラフとして見られ、すべての惑星を入れて、隣接リストを使用して格納することができます。
しかし、実際に我々はそれをこのように解釈することができます。隣接テーブルヘッダは、中国聯通の関係は1つの地球と他の惑星を再構築されますを示すために使用することができます。
参照コード:
1 // 抵抗更新プログラムqwq 2の#include <cstdioを> 3の#include <入出力ストリーム> 。4の#include <アルゴリズム> 5の#include <キュー> 6の#include <ベクトル> 7の#include <CStringの> 8 の#define N 100010 。9 使用した 名前空間STD; 10 // 図に格納されている隣接テーブル 11 構造体ノード{ 12は INT次に、版、から、 13である } G [N << 2 ]; 14 int型N-、M、K、TOT; 15 int型のヘッド[N << 2]、ANS [N << 2 ]、FA [N << 2 ]、B [N << 2 ]。 16 ブール V [N << 2 ]。// 是否需要重建 17 空隙追加(int型のx、int型のY) 18 { 19 G [++ TOT] .VER = Y、G [TOT]。=のX。 20 G [TOT] .next =頭部[X]、ヘッド[X] = TOTを、 21 } 22 INT GET(INT X) 23 { 24 であれば(FA [X] == x)をリターンX。 25 リターン FA [X] = 取得(FA [X])。 26 } 27 空隙マージ(int型のx、int型のY) 28 { 29 、X = 取得し、(X)、Y = 取得(Y) 30 であれば(!X = Y)FA [X] = yと、 31 } 32 のint main()の 33 { 34 のmemset(V、0、はsizeof (V))。 35 のmemset(B、0、はsizeof (b)参照)。 36 のscanf(" %D%dの"、&N、&M)。 37 38 のためには、(int型 i = 0 ; iがn <; iは++)FA [I] = I。// 初始化 39 40 のために(int型 i = 1 ; iが<= M; iは++ ){ 41 、INT X、Y。 42 のscanf(" %D%dの"、およびX&Y)。 43 、(x、y)を追加(Y、X)。 44 } 45 のscanf(" %dの"、&K)。 46 // 需要重建的星球 47 のための(int型 i = 1 ; iは= Kを<; iは++ ){ 48 scanfの(" %のD "、&B [I]); 49 V [B [I] = 1 ; // それが惑星再構築する必要が記録 50 } 51が INT CNT = N- K; 52である // 再構築しません我々は、ユニコム惑星まで破壊されないであろう 53 // 2つの惑星が存在する場合、すなわち、組み合わされ再構築しない場合 54である ため(INT I = 1 ; Iは、<= 2 ; * M I ++ ){ 55 IF( !V [G [I] .VER] &&!V [G [I] から ] && GET(G [I] から)!= GET (G [I]は.VER)){ 56であります CNTは- ;(G [I]マージから、Gは、[I]は.VER); 57である } 58 } 59の // 構造を背中合わせから破壊惑星 60の [K + ANS 1 ] = CNT; 61である ため(INT I = K; I> = 1 ; i-- ){ 62は // リンクブロックの数をカウント 63である ++ CNT; V [B [I] = 0 ; 64 用(INT J =ヘッド[B [I]]。 J; J = G [J] .next){ 65 IF(V [G [J] .VER] &&!GET(G [J] から!)= GET (G [J] .VER)){ 66 cnt-- ;(B [I]、G [J] .VER)をマージします。 67 } 68 } 69の ANS [I] = CNT。 70 } 71 のための(int型 i = 1 ; iは= K + < 1 ; I ++)のprintfを(" %Dを\ n " 、ANS [I])。 72 リターン 0 ; 73 }