5780:バーンディスク(フロイド+オーダーのルートを見つける必要があります)

FJOI2010はサマーキャンプの終わりに向かって、多くのキャンパーは、全体のサマーキャンプ中に提示された情報を送信するために来たとき、我々は戻って学習し続けるように、みんなのためにCDを焼きます。委員会は、この良いアイデアだと思います!しかし、今は組織委員会は、誰もがデータを燃やしてCDに得ることができることを保証することはできませんが、十分な空のCD-ROMを持っていなかった、どのようにそれを行うには?

すべてのキャンパーの地理的関係はいくつかのキャンピングカーは、実際には、彼らが唯一の人の後にCDを取得しているため、他の人がUディスクのようなもので行くことができ、缶を必要とし、都市であることが判明何のDYJ分析ああコピー!

彼らはもちろん、彼にFJOIがチームを説い当社との協力の精神に外国人である情報のコピーを来て他の人を許すことに消極的であってもよいし、彼にいくつかの情報のコピーを来て喜んでです!

今、私たちはNキャンパー(2≤N≤200)の合計が、各キャンピングカーの数は1〜Nであることを前提としてい 彼らの意欲を埋める各キャンピングカーは、情報のコピーは彼に来て作るように一人一人にDYJは、アンケートを発行しました。AがBにデータをコピーする意思がある、とBとCにデータをコピーすることをいとわない場合はもちろん、その後、Aが一度情報を提供し、次いで、B、Cは、情報を取得します。

さて、あなたはDYJあなたはすべてのキャンパーが戻って、情報のサマーキャンプを得ることができることを確実にするために、書き込みたいどのように多くのディスク少なくとも組織委員会の計算を助けるためにアンケートを回復するに従って、プログラムを書くのか?

 

 

エントリー

 

まず、N行に続く数Nは、それぞれ、キャンパーの各情報には、他のキャンパーの独自のコピーを取得して喜んでです。すなわち、I + 1の入力データが0で終わる、これらのキャンパーの数にデータをコピーするために喜んでi行目のキャンピングカーを表します。キャンパーは、すべての人に情報のコピーをしたくない場合は、対応する行は、スペースで区切られた行の数との間の数だけ1つのゼロです。

 

輸出

 

書き込みたいCDの最小数を表す正の整数。

 

サンプル入力

5
2 4 3 0
5 0
0
0
1 0

サンプル出力

 1

 

問題解決のアイデア:あなたは互いに素セットを使用することはできません、互いに素セットは、双方向の方向があるということです

1の#include <iostreamの>
 2の#include <CStringの>
 3の#include <アルゴリズム>
 4の#include <地図>
 5の#include <sstream提供>
 6の#include <ベクトル>
 7の#include <キュー>
 8の#include <cstdioを>
 9# <などがセット >
 10 typedefの長い 長いLL。
11  
12  使って 名前空間STDを、
13  
14  int型 ARR [ 205 ] [ 205 ]。
15  int型のプレ[ 205 ]。
16 int型のn;
17マップ< int型int型 > ミリアンペア。
18  
19  INT メイン(){
 20の      IOS :: sync_with_stdio()。
21      CIN >> N。
22      のためには、int型 i = 1 ; iがn = <; I ++の)事前[I] = I。
23      のint jishu = 0 24      のためにint型 i = 1 ; iが<= N; iが++ ){
 25          のint D。
26          一方(CIN >> D && D!= 0 ){
 27             ARR [I] [D] = 1 ;
 28          }
 29      }
 30      のためにINT I = 1 ; I <= N; I ++の31である     ためINT J = 1。 ; J <= N; J ++ 32      のためのINT K = 。1 ; K <= N; K ++ ){
 33で         IF(ARR [J] [K] == 1続行 ;     // 接続自体場合もあれば
34である          ARR [J] [K] =分(ARR [J] [I]、ARR [I] [K]);     // 2は、接続部に接続されている場合は
35      }
 36     以下のためにint型 i = 1 ; iは= N <; I ++)    // 找根
37      のためにINT J = 1 ; J <= nであり、j ++ ){
 38          場合(I == j)は続けます39          もし{([I] [J] ARR)
 40              プレ[J] = [i]を事前。      // J的根为I的根
41          }
 42      }
 43      INT NUM = 0 44      のためにint型 i = 1 ; iが<= N; iが++ ){
 45          であれば(私==事前[I])NUM ++ 46      }
 47      COUT << NUM << ENDL。
48      リターン 0 ;
49 }
コードの表示

 

おすすめ

転載: www.cnblogs.com/qq-1585047819/p/11279035.html