バグズライフ
教授ホッパーは、バグの希少種の性行動を研究しています。彼は、彼らが2人の異なる性別を特長と反対の性別のバグ彼らは唯一相互作用することと仮定します。番号が背中にプリントされたため、彼の実験では、個々のバグとその相互作用は、識別することが容易でした。
問題は、
バグの相互作用のリストを考えると、それはそれを改ざんするいくつかのバグの相互作用が含まれている場合、実験は無同性愛者のバグを持つ2人の男女の彼の仮定をサポートしているかどうかを決定します。
入力
出力
サンプル入力
2 3 3 1 2 2 3 1 3 4 2 1 2 3 4
サンプル出力
#1シナリオ:。 !不審なバグが見つかりました :シナリオ#2 !のないバグが疑わしいた
タイトルの意味を:n個の昆虫、Mの関係を示します。与えられた、bが異性に属し、Bを示しています。彼は同性愛者の虫があるかどうかを尋ねました。
解決策:
解決策1:POJ1703前の溶液と、その後、対称見て、異性のため、B、+ nは、bが同性A、B +はn同性愛者です。判断ができるたびに。
書式#include <iostreamの> の#include <cstdioを> する#include <CStringの> 使用して 名前空間をSTD。 typedefの長い 長いLL。 const int型 MAXN = 1E4; BOOL VIS [MAXN]。 INT PR [MAXN]。 整数N、M。 INT検索(INT X) { 場合(X =!PR [X]) PR [X] = 見つける(PR [X])。 戻りPR [X]。 } ボイド(参加int型のx、int型のY) { int型 F1 =を(x)を見つけます。 int型 F2 = (y)を見つけます。 もし(!F1 = F2) { PR [F1] = F2。 } を返します。 } ボイドのinit() { ため(intは iは= 1 ; I <= 2 * N + 100 I ++; ) PR [I] = iは、 } ブールチェック(int型のx、int型のY) { 場合(!見つける(X)= 見つける(Y)) 、戻り 偽。 返す 真; } int型のmain() { int型、T。 scanf関数(" %のD "、&T)。 int型 AC = 1 ; 一方、(t-- ) { scanf関数(" %D%D "、&N、&M)。 INT OK = 0 ; 初期化(); 一方、(M-- ) { int型のX、Y。 scanf関数(" %D%D "、およびX&Y)。 (X参加 + N、Y); 参加(X、Yを+ N)。 もし(チェック(X、Y)||チェック(X + N、Y + N)) { OK = 1 。 } } // (iは1 = INT; I <= 2 * N; iは++)用 // COUT << PR [I] <<」「。 // coutの<<てendl; printf(" シナリオ#%dの:\ N "、AC ++ ); もし(OK) coutの << " 不審なバグが見つかりました!" << てendl; 他の coutの <<ノー不審なバグが見つかりました!「 << ENDL; COUT << ENDL; } }
解決方法2:加重とプログレッシブ方式のセットが行います。類似点と性別の違いを記述するために] [VIS参加し、ここ0,1 2つの数値を統一。VIS [I] == 0 == 1異性、I及びその性別ノードルートを表します。即ちVIS []には、そのルートノードと昆虫性別電流差に記載されています。()を見つけると参加()関数は、圧縮されなければならない道を見つけ、変更を加える必要があります。すなわち:
[C] = B、まずBを見つけるだろう、と究極の親ノードがVISではありませんので、VIS [C]レコードは、CとBとの間の差であるPR、Cノードの父ノードを見つけ、)私は(見つけましょう[C]、我々はVIS [C]を更新する必要がありそう。すなわちVIS [C] =(VIS [C] + VIS [PR [C])%2。これは、外観を見つけるために、独自の例を設定することができ、これは確かにVIS [C] Aノードへのポイントに式です。父ノードとして変更しても] [中途VIS、絶えず変化します。
もし(X =!PR [X]) { int型の父親= (PR [X])を見つけます。 VIS [X] =(VIS [X] + VIS [PR [X]])%2 。 PR [X] = 父。 } 戻り PR [X]。
また、)(1への参加:同じルート場合、Bを入力し、直接同じであり、同じゲイである、又はないもの] [それらのVISを決定します。2:異なるルートの、Bは、そう、Bに属する2つのツリーが接続されているであろう。ストレート:この時間は確かのように表現、B入力を意味するデフォルトです。だから、bはあなたが[]とVIS [B] VISによって確立する必要が、リンクを確立する必要があり、ルートノードをリンクします。式は、VIS [父()] =(VIS [A] + VIS [B] +1)%2;この父親()と父(B)との間の性差との類似性が構築されます。
一般的に、このソリューションは、すべての時間は最初の裁判官で、その後、操作を実行し、その同性愛者を発見し、我々は動作しません。そうでない場合は、デフォルト通常、それを操作します。
#include <iostreamの> する#include <cstdioを> する#include <CStringの> する#include <アルゴリズム> 使用して 名前空間をSTD。 typedefの長い 長いLL。 const int型 MAXN = 2E3 + 10 。 INT PR [MAXN]、VIS [MAXN]。 整数N、M。 ボイドのinit() { ために(INTは iは= 1 ; I <= N; I ++ ) { PR [I] = I。 VIS [I] = 0 ; } } int型(見つけますINT X) { もし!(X = PR [X]) { int型の父親= 見つける(PR [X])。 VIS [X] =(VIS [X] + VIS [PR [X]])%2 。 PR [X] = 父。 } 戻りPR [X]。 } INT(参加int型のx、int型のY) { int型 F1 =(X)を見つけるF2 = (y)を検索します。 もし(F1 == F2) { もし、((VIS [X] + VIS [Y])%2 == 0 ) リターン 1 。 そうしないと リターン 0 ; } 他 { PR [F1] = F2。 VIS [F1] =(VIS [X] + VIS [Y] + 1)%2 。 } 戻り 0 。 } int型のmain() { int型、T。 scanf関数(" %のD "、&T)。 int型 AC = 1 ; 一方、(t-- ) { scanf関数(" %D%D "、&N、&M)。 初期化(); int型の OK =0 ; 一方、(M-- ) { int型、A、B scanf関数(" %D%D "、&、&B)。 もし((A、Bに参加)== 1 ) { OK = 1 。 } } のprintf(" シナリオ#1%のD:\ n "、AC ++ )。 場合(OK) { 裁判所未満は << " 不審なバグが見つかりました!" << てendlを。 } 他の { 裁判所未満 << 「いいえ不審なバグが見つかりませんでした!」 << てendlを。 } COUT << ENDL。 } }