POJ-2289.jamiesコンタクトグループ(バイナリ複数回答+二部マッチング)

ジェイミーの連絡先グループ

制限時間:  7000MS   メモリの制限:  65536kも
合計の提出:  9227   受け入れ:  3180

説明

ジェイミーは、非常に人気のある女の子ですし、友人のかなり多くを持っているので、彼女はいつも彼女の携帯電話に非常に長い連絡先リストを保持します。連絡先リストは、彼女が友人の番号を見つけるために、リスト全体を閲覧することが頻繁に長い時間がかかるほど長くなっています。ジェイミーの親友とプログラミングの天才として、あなたは彼女のグループ間の友人の番号を検索するのが容易になりますように、彼女はグループのコンタクトリストとは、最大のグループのサイズを最小化することを示唆しています。ジェイミーはあなたのアドバイスを取り、あなたは彼女の友人の名前を含む彼女の全体の連絡先リスト、彼女が持っていると、すべての友人が何にグループに属する可能性が希望するグループの数を示します。

入力

最大20のテストケースがあります。容易ケースNは、コンタクトリストの長さであり、Mは、グループの数であり、二つの整数N及びMを含む行から始まります。Nラインが、その後に従ってください。各行には、友人の名前が含まれており、グループは、友人はに属している可能性があります。あなたは、Nが1000以上のものではありませんし、Mは、これ以上の500以上の名前が唯一のアルファベット文字を含んでいないだろうし、もはや15文字を超えることになるであると仮定することができます。いいえ二人の友人は、同じ名前を持っていません。グループラベルが0とMとの間の整数である - 最後のテストケースの後1、入力を終了一行 '0' があります。

出力

各テストケースのために、出力単一の整数、最大のコンタクトグループのサイズを含む行。

サンプル入力

3 2 
ジョン・0 1 
ローズ1 
メアリー1 
5 4 
ACM 1 2 3 
ICPC 0 1 
アジア0 2 3 
地域1 2 
上海0 2 
0 0

サンプル出力

2 
2

ソース

 
この問題は、しばらくの間、行う必要があり、彼は私がオーバーと一致するようにコードを変更することが古い感じ......それは明らかに半分ですが、すべての一致のための最大需要後の最小パケットを一致させることですが、それを手綱する方法を、最小グループの上限は、その後、我々は条件を判断によって制約することができるように、要求の対象として:...そして最も致命的では私自身のテストの答えは、すべての訓練を受け、訓練を受け、訓練を受けた、私の最初の考えを持っていたあります私たちは人々のマッチングセットを発見していない場合は、1が最低、そうでない場合は、最初に一致しなければなりません直接一致するので、その後、他の人に合うように、彼は試合を手放すことを、ルールに一致することは、まだケースですが、ノードがあれば、我々はできませんので、すべてのグループがこのノードに接続されていることを意味し、上記の事情を満たす他の誰かによってマッチされている、それに合わせて、その最初の直接選挙が、ここでの問題はありませんこれは確かに最小値に加算されますので、試合後に最小が誰であるかを決定するために最初の試合は、.soが半分答え下記の解答には影響しません。
 
二値の答え:
  バイナリ答え、上限を変更することができる場合は、チェックが一致するように各完全一致、その後、変更のR、Lまたは変更して、[OK。出力半ば。
  1  / * *********************************************** *************************
   2      >ファイル名:POJ-2289.jamies_contact_groups.cpp
   3      >著者:CruelKing
   4      >メール:QQ @ 2016586625。 COM 
   5      >作成日時:2019年09月03日星期二21时09分58秒
   6  ****************************** ***************************************** * / 
  7  / * 
  8  の#include <入出力ストリーム>
   9  の#include <sstream提供さ>
 10  の#include <ストリング>
 11  の#include <CStringの>
 12  名前空間STDを使用して、
13  
14 CONST INT MAXN = 1000 + 5、MAXM = 500 + 5、INF = 0x3f3f3f3f。
15  
16  のint N、M。
17  文字列str;
18  文字名[20]。
19  INTリンカー[MAXM] [MAXN]。
20  BOOL使用[MAXM]、G [MAXN] [MAXM]。
21の 
22  ブールDFS(INT U){
 23      のための(int型V = 0; V <M、V ++){
 24          IF(!G [U] [V] &&使用[V]){
 25              使用[V] =真;
26              IF(リンカー[V] [0] == 0){
 27                  リンカー[V] [++リンカー[V] [0] = U。
28                  真のリターン。
29              }
 30             以下のために(INT I = 1; I <=リンカー[V] [0]; iは++){
 31                  IF(DFS(リンカー[V] [I])){
 32                      リンカー[V] [I] = U。
33                      真のリターン。
34                  }
 35              }
 36              リンカー[V] [++リンカー[V] [0] = U。
37              真のリターン。
38          }
 39      }
 40      偽リターン。
41  }
 42  
43  INTメイン(){
 44      ながら(CIN >> N >> M &&(N || M)){
 45          のmemset(G、偽、はsizeofのG)。
46         用(INT i = 0; iがn <; Iは++){
 47              CIN >>名。
48              のgetline(CIN、STR)。
49              にstringstream ssの。
50の             SS << STR。
51              INT X。
52              一方(SS >> X)
 53                  G [i]が[X] =真。
54          }
 55          INT RES = 0。
56          (;私がm <; I = 0をint型I ++)はリンカー[I] [0] = 0。
57          {(; iがN <I ++は、I = 0をINT)のための
 58              (使用sizeofは、偽、使用)のmemset。
59              (DFS(I))のres ++であれば、
60          }
61          INT M = 0。
62          のために(0 = I int型、iがmを<; iは++){
 63              IF(M <リンカー[I] [0])M =リンカー[I] [0]。
64          }
 65          COUT << M << ENDL。
66      }
 67      リターン0。
68  }
 69  * / 
70の#include <iostreamの>
 71の#include <sstream提供さ>
 72の#include < ストリング >
 73の#include <CStringの>
 74  の#define半ば((L + R)>> 1)
 75  使用 名前空間STDを、
76  
77  のconst INT MAXN =  + 5、MAXM = 500 + 5、INF = 0x3f3f3f3f 78  
79  のint N、M、L、R。
80  文字列strの。
81  チャー名[ 20 ]。
82  int型リンカー[MAXM] [MAXN]。
83  BOOL 使用[MAXM]、G [MAXN] [MAXM]。
84の 
85  ブール DFS(INT U){
 86      のためのint型 V = 0 ; V <M、V ++ ){
 87          であれば(G [U] [V] &&![V])を用い{
 88              使用[V] = 89              であれば(リンカー[V] [ 0 ] < MID){
 90                  リンカー[V] [++リンカー[V] [ 0 ] = U。
91                  リターン 92              }
 93              のためのint型 i = 1 ; iは=半ばを<; iは++ ){
 94                  であれば(DFS(リンカー[V] [I])){
 95                      リンカー[V] [I] = U。
96                      リターン 97                  }
 98             }
 99          }
 100      }
 101      戻り 102  }
 103  
104  INT のmain(){
 105      ながら(CIN >> N >> M &&(N || M)){
 106          のmemset(G、はsizeofのG)。
107          のためのint型 i = 0 ; iがN <I ++は{)
 108              CIN >> 名。
109              のgetline(CIN、STR)。
110の             にstringstream SS。
111の              SS <<STR;
112              INT X。
113              一方(SS >> X)
 114                  G [i]が[X] = 115          }
 116          / * 
117          INT RES = 0。
118          L = 0、R = MAXN << 1。
119          のための(I 0 = int型;私がm <; I ++)は、リンカー[I] [0] = 0。
120          のための(I 0 = int型、iがN <; Iは++){
 121              (使用sizeofは、偽、使用)のmemset。
122              (DFS(I))RES ++場合。
123          }
 124          COUT << RES << ENDL。
125          * / 
126          、L =0、R = N。
127          int型のres;
128          一方(L <= r)は{
 129              のRES = 0 130              のためのint型 iは= 0 ;私がm <; I ++)は、リンカー[I] [ 0 ] = 0 131              のためのint型 iは= 0 ; iがN <; Iは++ ){
 132                  (使用のmemset sizeofは使用されます)。
133                  であれば(DFS(I))RES ++ 134              }
 135              もし(N == RES)R =ミッド- 1 136               L =ミッド+ 1 137          }
 138          COUT <<中間+ 1 << ENDL。
139      }
 140      戻り 0 ;
141 }

 

おすすめ

転載: www.cnblogs.com/bianjunting/p/11456522.html