トピックの背景
このゲームの最初の質問は、最初に100ポイントを取ったシンプルなバーを与えます。
タイトル説明
n個の都市、中央の一方通行の道路リンクがありますが、今、n個の都市を与えられ、そして少なくともn個すべての都市がいくつかの都市にされているというニュースを公開する必要が作るように頼ま間の道路に沿って広がっていくメッセージ、および道路メッセージ。
入出力フォーマット
入力フォーマット:
nは二つの整数の最初の行には、mは一方向パスをM、Nの都市を表します。
二つの整数bの次のm個の行は、EはBからの道路、道路を繰り返してもよいし、ループバックの存在Eに表さ。
出力フォーマット:
行、少なくともいくつかの都市で発表することを表す整数を。
サンプル入力と出力
説明
[データ範囲]
データ、n≤200の20%。
データ、n≤2,000の40%。
データの100%、n≤100,000、m≤500,000へ。
[リミット]
制限時間:1秒、メモリの制限:256M
注記
サンプルNo. 4、市内の5つの公開されたニュース。
分析:
この質問は非常に簡単ですか???私は多くの時間をしました。。。まず%%%の伝説の牛私はこの問題のために変更するのに役立ちます。
この質問に強連結成分を依頼することですが、重い行くためのトラブルの多くは、最終的には程度を決定するために、問題への解決策を見たアイデアは突然EMました。。。
コード:
1の#include <iostreamの> 2の#include <cstdioを> 3の#include <積層> 4の#include <CStringの> 5 使って 名前空間STDを、 6 のconst int型 M = 5000005 。 7 int型N、M。 8 INT [M]に、[M]次に、ヘッド[M]。 9つの int型のANS; 10 INT デュ[M]。 11インラインINT のget (){ 12 チャー C = GETCHAR()。 13の INTは RES = 0 。 14 しばらく(C> ' 9 ' || C < ' 0 ')C = GETCHAR()。 15 一方、(C <= ' 9 ' && C> = ' 0 ' ){ 16件 のRES =(RES << 3)+(RES << 1)C- + ' 0 ' 。 17 C = GETCHAR()。 18 } 19の リターンRES。 20 } 21 のint TOT。 22インラインボイドアドオン(int型のu、int型V){ 23 次の[++ TOT = 頭部[U]。 24 頭[U]は= TOTを、 25 [TOT =にV; 26 } 27 INT 低い[M]、DFN [M]。 28 BOOL VIS [M]。 29 int型 で、今、 30スタック< INT > Q。 31 のint F [M]。 32 ボイド tarjan(INT U){ 33の DFN [U] =低[U] = ++ で、 34 q.push(U)。 35 VIS [U] = 真。 36 のための(int型 I =ヘッド[U]; I; I = 次の[I]){ 37 のint V = 乃至[I]。 38 であれば([V] == DFN - 1 ){ 39 tarjan(V)。 40 低[U] = 分(低[U]、[V]低いです)。 41 } 42 そう であれば(VIS [V])がロー[U] = 分(低[U]、DFN [V])。 43 } 44 INT V。 45 であれば(DFN [U] == 低[U]){ 46 今++ 。 47 行う{ 48 V = q.top()。 49 F [V] = 今。 50 VIS [V] = 偽。 51 q.pop()。 52 } 、一方(U =!V)。 53 } 54 } 55 INT メイン(){ 56 N = 取得し()、M = GET ()。 57 のために(int型 I = 1 ; I <= M; iが++ ){ 58 、INT X = GET()、Y = 取得(); 59 であれば(X =!y)は(x、y)を加えます。 60 } 61 memsetの(VIS、偽、はsizeof (VIS)); 62 のmemset(DFN、 - 1、はsizeof (DFN))。 63 のためには、(int型 i = 1 ; iが<= N; iが++ ) 64 場合(DFN [I] == - 1 )tarjan(I)。 65 のためには、(int型 i = 1 ; iがn = <; iは++ ){ 66 のための(int型 J =ヘッド[i]は、J、J = 次の[J]){ 67 INT Z = [J]であり; 68 ならデュ(![I] = F [Z] F)++ [Z] [F] 。 69 } 70 } 71 // COUT <<今<< ENDL。 72 のためには、(int型 i = 1 ; iは今= <; iは++ ){ 73 // COUT <<デュ[I] << ENDLと、 74の ANS + =(DU [I] == 0 )。 75 } 76 COUT << ANS << ENDL。 77 リターン 0 。 78 }