メッセージを広めます

トピックの背景

このゲームの最初の質問は、最初に100ポイントを取ったシンプルなバーを与えます。

タイトル説明

n個の都市、中央の一方通行の道路リンクがありますが、今、n個の都市を与えられ、そして少なくともn個すべての都市がいくつかの都市にされているというニュースを公開する必要が作るように頼ま間の道路に沿って広がっていくメッセージ、および道路メッセージ。

入出力フォーマット

入力フォーマット:

 

nは二つの整数の最初の行には、mは一方向パスをM、Nの都市を表します。

二つの整数bの次のm個の行は、EはBからの道路、道路を繰り返してもよいし、ループバックの存在Eに表さ。

 

出力フォーマット:

 

行、少なくともいくつかの都市で発表することを表す整数を。

 

サンプル入力と出力

入力サンプル#1: 
5 4 
1 2 
2 1 
2 3 
5 1
出力サンプル#1:
2

説明

[データ範囲]

データ、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 }

 

おすすめ

転載: www.cnblogs.com/kanchuang/p/11146168.html