この質問は意味しています
問題
1:ネットワーク内のすべての学校は、最終的にソフトウェアにアクセスする必要がありますように、初期リリースのソフトウェアは、少なくとも学校の数が必要です。
2:少なくともいくつかの伝送線(エッジ)を追加する必要性が、学校に任意のソフトウェアの支払い後、ネットワーク内で伝送いくつかの後、最終的にすべての学校は、ソフトウェアへのアクセス権を持っています。
実は、この問題はどのくらいの1、支配集合図を依頼するのですか???この問題を解決するためには非常に簡単です、マップのポイントを縮小した後、0度ポイントの数を見つけ、支配セットです。支配的な内部は、すべての点が強く接続されていないかもしれないが、この時点で到達することができます。
第二の問題は、我々だけが何であるかを尋ねることとして、非常に単純に、我々は、接続0度を指摘することができ、中で、あなたが最大値を取ることができますポイント数の0 0の外に登録する必要があり、実際にはより簡単です0以上の点の程度、従って強連結グラフのプロパティを確保します。実際には、これは、グラフを描い補完されます。
書式#include <iostreamの> 書式#include <stdio.hに> する#include < 文字列の.h> の#include <アルゴリズム> 使用して 名前空間はstdを、 CONSTの INT N = 100010、M = 1000010 。 INT [M]、次に[M]、ヘッド[N]、DFN [N]、低[N]版。 INT STA [N]、イン[N]、C [N]、in_deg [N]、out_deg [N]。 INTのN、M、TOT、NUM、上部、CNT。 ボイド追加(int型のx、int型のY) { 版[ ++ TOT = Y、次に[TOT =頭部[X]、ヘッド[X] = TOT。 } ボイド tarjan(INT X) { DFN [X] =低[X] NUM = ++; // + +1 SEQ ID STA [トップ++] = X、INS [X] = 1 ; // スタック、スタックとマークされた ため(INTヘッド= I [X]; I; Iは次に= [I]) // アクセス開始 IFを(DFN [版[I])!// 処理されていない場合は 、{ Tarjan(版[I]); // DFSを 低[X] = 分(低[X]、低[版[I]は]); // 再帰うち、比較/父の息子であり、強連結成分のサブツリールート最小に関連する対応関係の木、あります物事 } 他の IF (INS [版[I]]) 低[X] = 分(低[X]、DFN [版[I]]); // 比較息子/父です。リンク間の対応は IF(DFN [X] ==低[X])//が強く内部コンポーネントを接続するサブツリー全体の最小のルートを見つけます。 { CNT ++ ; INT Y; DO { Y = STA [トップ- ]、INS [Y] = 0 ; C [Y] = CNT; // SCC [CNT] .push_back(Y); } ながら(X! = Y); } } ボイドが解決(INT N-) { ため(INT I = 1 ; Iは<= N-; I ++は) { IF(! }DFN [I]) { tarjan(I)。 } } もし(CNT == 1 ) { のprintf(" 1つの\ N0の\ n " ); 返します。 } のための(INT U = 1 ; U <= N; ++ U) { ため(INT J =頭部[U]; J; J = 次に[J]) { int型 V = 版[J]。 もし(C [U] == C [V]) { 続けます。 [U] C] out_deg ; ++ } in_deg [C [V]] ++ ; } } int型、B。= 0 ; B = 0 。 以下のために(int型 i = 1 ; iは= CNTを<; iは++ ) { 場合(in_deg [I] == 0 ) { ++ 。 } そう であれば(out_deg [I] == 0 ) { B ++ 。 } のprintf(" %d個の\ n " 、A)。 printf(" %d個の\ n " 、MAX(A、B))。 } ボイドのinit() { memsetの(DFN、0、はsizeof (DFN))。 memsetの(低い、0、はsizeof (低))。 memsetの(頭、0、はsizeof (ヘッド))。 memset(in_deg、0、はsizeof (in_deg))。 memset(out_deg、0、はsizeof (out_deg))。 memset(INS、0、はsizeof (INS))。 トップ = 0 ; TOT =0 ; CNT = 0 ; NUM = 0 ; } int型のmain() { int型 TMP。 一方、(〜のscanf(" %d個"、&N)) { INIT()。 以下のために(int型 i = 1 ; iが= <N; iは++ ) { ながら(scanf関数(" %のD "、およびTMP)&& TMP)は { (I、TMP)を加えます。 } } (n)を解きます。 } 戻り 0 。 }