特別kuangbin - 図の通信A - 学校のネットワーク

この質問は意味しています

問題

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 
}

 

おすすめ

転載: www.cnblogs.com/bluefly-hrbust/p/11222329.html