- 試験:羅区
- 質問:2055
- タイトル:休日のホステル
- リンク:https://www.luogu.org/problem/P2055
まずクリア:各学生のキャンパスにはベッドがあります(唯一のキャンパスがあります)
アイデア:分析は、全てが眠るベッド持つことができるトピックは、すべての学生を求めていることがわかった(注:スリープ状態にちょうどベッドを、家庭や学校では行かないが、これは、それが友人をすることができ、あなたの自分のベッドでもよい)。その後、 、この質問は、私たちは、このようなサンプル図として、二部グラフと考えることができます。
(: - ---エッジ> 2、しかし、あなたは慎重に質問を読んで、タイトルの言葉がありますがないサンプル2いますが- A> BはベッドがBを眠ることができ表し)
隣接行列とする対象に、私たちものみの行に赤い点を検索する、側外青い点を無視することができる(問題ではない書かれたコード)
コード:
1つの#include <ビット/ STDC ++ H> 2 の#define INF 0x3f3f3f3f 3 使用して 名前空間STDを、 4 INT T、N、ヘッド[ 201 ]、NUM、VIS [ 201 ]、[選択し201、Q [] 201、] W [ 201 ]、ANS、CNT。 5 構造体ノード 6 { 7 INT に、次。 8 } STU [ 40001 ]。 9インラインボイド追加(int型のx、int型の Y)// 链式前向星 10 { 11 STU [NUM ++] = .next ヘッド[X]; 12である STU [NUM] .TO = Y、 13は ヘッド[X]は= NUMを、 14 リターン; 15 } 16インラインINT DFS(INT U)// 二分ハンガリーテンプレートアルゴリズム 。17 { 18である ため(登録int型 I =ヘッド[U]; I; I = STU [I] .next) 19 { 20は INT K = STU [I] .TO; 21は、 IF (VIS [K]) 22です { 23は 続行; 24 } 25 VIS [K] = 1 。 26 であれば(|| [k]を選択してください!DFS([k]を選択する)) 27 { 28 [K] =選択uと; 29 リターン 1 。 30 } 31 } 32 リターン 0 。 33 } 34 )(主符号付き 35 { 36 のscanf(" %dの"、&T)。 37 一方(T--)// 多组数据 38 { 39 のmemset(選択し、0、はsizeof(選択)); // 初始化 40 のmemset(ヘッド、0、はsizeof (ヘッド))。 41 NUM = 0 。 42の ANS = 0 。 43 CNT = 0 。 44 のscanf(" %d個"、&N) 45 のために(登録をint i = 1 ++; iが<= N I) 46 { 47 のscanf(" %d個"、&Q [I]); 48 } 49 用(登録INT I = 1 ; I <= N; ++ I) 50 { 51は scanfの(" %のD "、&W [I]); 52である IF(Q [I] !&& W [I])// 彼は彼の家の学校の生徒&&ない場合 53がある { 54で 追加(I、I); // 彼らは自分のベッドに眠ることができる 55 } 56をされる } 57である ため(登録int型 I =を1。 ; I <= N; ++ I) 58 { 59 用(登録INT J = 1、X、J <= N-; ++ J) 60 { 61は scanfの(" %のD "、およびX)、 62は IF (X) 63は 、{ 64 IF(Q [I])// 私は学校の生徒(ベッド)であれば 65 { 66 追加(J、I); // Jが眠ることができる 67 } 68 IF(Q [J])// 同様に 69 { 70 追加(I、J); 71である } 72 } 73である } 74 } 75 用(登録INT I = 1 ; I <= N; ++ I) 76 { 77 IF(Q [I] && W [I])/ / 私たちの学生は(それが学校の外にある場合、家庭ああを行くことができない)&&学校にない場合は 78 { 79 ++ CNT; // どのように多く、オペレータ簡単な答えの後について、レコード 80を 続行 ; //は彼を必要としません。何床がない 81 } 82 のmemset(VISは、0、はsizeof (VIS)); 83 IF)(DFS(I!)// 学生はベッドがない場合は 84 { 85 のprintf(" T_T \ N- "); //は泣い 86 BREAK ; 87 } 88 、他の 89 { 90 ++ ANS; // 学生の数が記録されているベッド 91である } 92 } 93 IF(N-ANS == - CNT)// 者が学校ベッド放置した場合 94 { 95 printf(" ^ _ ^ \ N- "); // 笑い 96 } 97 } 98 リターン 0 ; 99 }