タイトル説明
図の最初の回答に示す小さなチェーンによると、食物網のエコシステムの概略図である。今、あなたは食べ物を探している、n及びm種のエネルギーの流れの関係を問います。
種名は、A1 b1a2のb2a3 B3のようなエネルギーのM字状流との間のnの関係に1から番号付けされている...... AM-1 AI AI BIは種からのエネルギーの流れを表し、BM-1AMのBM
種BI、分離された個々の注目は、生物の食物連鎖ではありません。
入力形式
二つの整数n及びmの最初の行は、各列の次の2つの行が双方向整数m及びmは、エネルギーの流れとの間の関係を記述する愛。(データは、入力データシンボルの生物学的特性を確保し、しません
)エネルギーの流れ関係を複製する1 <= N <= 100000 0 <= M <= 200000タイトル答え保証バーストないINT
出力フォーマット
食物網における食物連鎖の数である整数
問題の解決策:対象のDP DAGのエントリは、問題解決のほとんどは偉大なを見つけるために、ゼロ点の程度を調べるために食物連鎖を見つけるための検索のバージョンであるメモリであり、
食物連鎖、私はそれがDAGであるため、qbxt zhhxギャングが、それを維持するためにキューに、再帰バージョンの配列を書き書きましたので、食物連鎖の各ポイントの数は、それはすべての前のノードであります
ゼロ度の食物連鎖、無処理時間、程度のマイナス1の数の後、転送に代わって完全にされてきた、最終カウントは、最後の点への答えである、すべての食物連鎖のためにゼロです。
ターンテーブル伝達方程式:
1の#include <cstdioを> 2の#include <iostreamの> 3の#include <CStringの> 4の#include <アルゴリズム> 5の#include <キュー> 6 の#define MAXN 100005 7 8 使用して 名前空間STDを、 9 10 構造体ノード 11 { 12 のint 編、NXT。 13 }。 14ノードのエッジ[ 200005 ]。 15 INT IND [MAXN]、最初の[MAXN]、DP [MAXN]、N、M、CNT。 16 INT アウト[MAXN]。 17 18インラインボイド add_edge(INT S、INT E) 19 { 20 CNT ++ 。 21 エッジ【CNTは] = .ED Eと、 22 エッジ= [CNT] .nxt 最初の[S]。 23 最初の[S] = CNT。 24 リターン; 25 } 26 27キュー< INT > Q。 28 29 のint main()の 30 { 31 のscanf(" %D%dの"、&N、&M)。 32 のために(int型 I =1 ; I <= M; iは++ ) 33 { 34個 のint S、E。 35 のscanf(" %D%dの"、&S&E)。 36 add_edge(S、E)。 37 IND [E] ++ ; 38 アウト [S] ++ ; 39 } 40 のための(int型 i = 1 ; iがn = <; iは++ ) 41 であれば(IND [I] == 0 ) 42 { 43 であれば(アウト [i])とDP [I] = 1 。 44 q.push(I); 45 } 46 ながら(!q.empty()) 47 { 48 のint p = q.front()。q.pop(); 49 のために(int型 I =最初の[P]を、I; I = エッジ[I] .nxt) 50 { 51 INT E = エッジ[i]は.ED。 52 DP [E] + = DP [P]。IND [E] - 。 53 であれば(IND [E] == 0 )q.push(E); 54 } 55 } 56 INT ANS = 0 。 57 のために(intです i = 1 ; iが<= N; iは++ ) 58 であれば(アウト [I] == 0)ANS + = DP [I]。 59 のprintf(" %dの" 、ANS)。 60 リターン 0 ; 61 }