効果の件名:
そして、あなたN Kを与えて、Kの小惑星は、N * Nの解像度にあります。カットは横または縦に武器をカットし、最小カットは、すべての惑星が破壊される回数を尋ねたことができますがあります。
分析:
1〜N行の数は列の右のセットに参加するために左にセット数nが1を添加しました。無向エッジは、二部グラフに接続されているようにすべての点は、その後、与えられています。
図1に示すように、それぞれの側のために、限り、エンドポイントの1つが選択されるように、遊星表さ物品側が破壊されてもよいです。あなたはこのエンドポイントを選択した場合も同様に、このエンドポイントへのすべての接続は、一度、すべての惑星が破壊されます。
図2は、選択されたIは---(左セット)1(右セット)このエッジを想定サンプルのために、私は、最初の列または垂直横カットのカットの最初の行を選択しました。そう除去及び1(左セット)されているすべての接続されたエッジは1共感(右のセット)のために、意志小惑星を表します。
両端点A及びBが選択されたエッジに対応し、他の選択された辺B、及びA及びBについての他の側面に関連していない必要が選択する必要はありません。ことが判明しました。
したがって、この問題の本質は、問題の数が最小の点によってカバーされていることです。
最低カバレッジ問題:図は、すべての側面を持つことができるので、ポイントの最小数を見つけるには、少なくとも一つのエンドポイントを選択されています。これは、選択された点は、端縁としてこの点が上書きされることを意味します。
次いで二部グラフは、最小のカバレッジ二部グラフの最大マッチングに相当します。
書式#include <iostreamの> の#include <アルゴリズム> 書式#include < 文字列の.h> の#define MAXN 1008 使って 名前空間はstdを、 INTのN、M、E、CNT。 int型のヘッド[MAXN]。 int型のCX [MAXN]、CY [MAXN]。 BOOL VIS [MAXN]。 構造体のエッジ { INT に、 int型の次; }エッジ[MAXN * MAXN]。 インラインボイド追加(INT U、INT V) { エッジ[ ++ CNT] .TO = V。 エッジ[CNT] .next =ヘッド[U]。 ヘッド[U] = CNT。 返します。 } インラインINT DFS(INT U) { ため(int型 ; I I = I =ヘッド[U] {エッジ[I] .next) のint V = エッジ[I] .TO。 もし(!VIS [V]){ VIS [V] = 真; もし(CY [V] == 0 || DFS(CY [V])){ CX [U] = V。 CY [V] = U。 リターン 1 ; } } } 戻り 0 。 } int型のmain() { // = freopenは( "テストデータ(7).IN"、 "R"、STDIN)。 scanf関数(" %d個の%のD "、&N、&M)。 int型A、B; 以下のために(int型 iは= 1 ; iが<= M; iは++){scanf関数(" %d個の%のD "、&A&B)は、追加(A、B);} int型 ANS = 0 。 以下のために(int型 i = 1 ; iは= N <; iは++ ){ もし {memsetの(VIS、(CX [i]が!)0、はsizeof(午前)); 年+ =DFS(I);} } のprintf(" %d個の\ n " 、ANS)。 }