羅区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 }

 

おすすめ

転載: www.cnblogs.com/qqq1112/p/11332850.html