小惑星のPOJ - 3041
ベッシーは、N×N個のグリッド(1 <= N <= 500)の形状に危険な小惑星フィールドを介して彼女の宇宙船をナビゲートすることを望みます。グリッドは、好都合には、グリッドの格子点に配置されているKの小惑星(1 <= K <= 10,000)、含まれています。
幸い、ベッシーは、任意の行または単一shot.Thisの武器で、グリッドの列のすべての小惑星を気化させることができる強力な武器を持っていることは、内のすべての小惑星の位置をsparingly.Given非常に高価であるので、彼女が使用したいですフィールドは、ベッシーは小惑星のすべてを排除するために発射する必要がショットの最小数を見つけます。
入力
幸い、ベッシーは、任意の行または単一shot.Thisの武器で、グリッドの列のすべての小惑星を気化させることができる強力な武器を持っていることは、内のすべての小惑星の位置をsparingly.Given非常に高価であるので、彼女が使用したいですフィールドは、ベッシーは小惑星のすべてを排除するために発射する必要がショットの最小数を見つけます。
* 1行目:二つの整数NとK、単一のスペースで区切られています。
*ライン2..K + 1:各行は、二つのスペースで区切られた整数Rを含み、C(1 <= R、C <= N)は、それぞれ、小惑星の行と列の座標を示します。
出力
*ライン2..K + 1:各行は、二つのスペースで区切られた整数Rを含み、C(1 <= R、C <= N)は、それぞれ、小惑星の行と列の座標を示します。
* 1行目:ベッシーが撮影しなければならない時間の最小数を表す整数。
サンプル入力
3 4 1 1 1 3 2 2 3 2サンプル出力
2ヒント
INPUTの詳細:
以下の図は、「X」は小惑星となるデータを表し、「」空のスペースです:
XX
.X。
。バツ。
OUTPUTの詳細:
ベッシーは(1,1)で小惑星を破壊するために、行1を横切って発射及び(1,3)、その後、彼女は(2,2)で小惑星を破壊するために、列2をダウン発射てもよいし、(3,2) 。
以下の図は、「X」は小惑星となるデータを表し、「」空のスペースです:
XX
.X。
。バツ。
OUTPUTの詳細:
ベッシーは(1,1)で小惑星を破壊するために、行1を横切って発射及び(1,3)、その後、彼女は(2,2)で小惑星を破壊するために、列2をダウン発射てもよいし、(3,2) 。
ID-OJ:
POJ-3041
著者:
Caution_Xの
提出のDATE:
20191002個の
タグ:
二部グラフの最小頂点被覆の
記述モデル:
Nグリッド×Nを考えると、グリッド上の多くのポイントがあり、ラインは現在、排除するために使い捨てすることができまたは列上の点の全てが、除去するためにすべてのポイントの最小値を複数回求められることができる
:それを解決するための主要なステップ
アイデアを:
(1)二部グラフを確立し、横軸と縦軸の両側上の点、それぞれ、グリッド上(x、y)は二部グラフは、xとyの左側に表示され表す点が右に一致させることができ
、我々は、図クリアの左側の点xを選択した場合(2)、実際には、その後、横座標点xを除去します図マッチの点xの右側にある全ての点(右点yは、同様にクリア選択)一緒にクリアされる
点の最小数の二部グラフマッチング(3)今、すなわち点、最小数の全ての側面をカバーすることを意図変換質問
ステップ:
(1)構成図の
最小マッチング(2)二部グラフ=最大カバレッジ部グラフ
二部グラフ法の最大カバレッジ要件:
(1)点に関連付けられたエッジを横切る、左側の点X1を選択し、ある権利を見つけます(点Y1と一致する2点を結びます X1、Y1)、
(2)マッチング点は、点Y1に対応する場合、左点X2を選択していき、X 1は、もしそうであれば、(X1、Y2)、(X2、新たなマッチング点Y2が存在しない検索され 、Y1 、探し続けるない場合はマッチポイントを見つけられませんでした最後に通過した場合)、一致点X2は、次のポイントは、左の点なし利用可能になるまで左引き続き
ACコード:
書式#include <cstdioを> する#include <CStringの> 使用して 名前空間はstdを、 INTのライン[ 550 ] [ 550 ]。 INTは使用[ 550 ]、G [ 550 ]。 整数N、K。 BOOL見出さ(INT X) { ため(int型 i = 1 ; iが<= N; iは++ ){ 場合(!ライン[x]は[I] && [i]が用いられる){ 使用[I] = 1 。 もし(G [i]が== - 1 || 見出さ(G [I])){ G [I]= X。 リターン 1 ; } } } 戻り 0 。 } int型のmain() { // freopenは( "INPUT.TXT"、 "R"、STDIN)。 memset(ライン、0、はsizeof (ライン))。 memsetの(G、 - 1、はsizeof (G))。 scanf関数(" %d個の%のD "、&N&K)。 以下のために(int型 i = 0 ; iはKを<; Iは++ ){ int型のX、Y。 scanf関数("%D%D 」、およびX&Y); 線[X] [Y] = 1 ; } int型の合計= 0 ; のため(int型 i = 1 N = iは<; iは++ ){ 使用のmemset(0、はsizeof ;)(使用) する場合(実測(i))を合計++ ; } のprintf(" %d個の\ n " 、和); 戻り 0 ; }