基本的な考え方:
同様の問題は、それらを繰り返しません。
キーポイント:
ノー;
書式#include <iostreamの> 書式#include <stdlib.h>に含ま 書式#include <stdio.hに> 書式#include <ベクトル> 書式#include <文字列> 書式#include <math.h>の 書式#include <アルゴリズム> 書式#include <CStringの> 書式#include <マップ> 書式#include <キュー> 名前空間stdを使用。 int型のn; ダブルP、R。 ダブルエンド= 10000000; int型CNT = 0; 構造体ノード{ ベクトル<整数>子。 int型層と、 }。 ベクター<ノード>ツリー。 ボイドlayer_init(){ (tree.size()== 0)の場合 リターン; ツリー[0] .layer = 0。 キュー<整数> Q; q.push(0)。 しばらく(!q.empty()){ INTインデックス= q.front()。 q.pop(); 以下のために(INT I 0 =; I <ツリー[インデックス] .child.size(); I ++){ 。ツリー[ツリー[インデックス] .child [I] =層ツリー[インデックス] .layer + 1。 q.push(ツリー[インデックス] .child [I])。 } } } ボイドlayer_find(INT N){ ダブルK; IF(ツリー[N] .child.size()== 0){ K = P * POW(1つの+ 0.01 * R、ツリー[N] .layer)。 // coutの<< K <<てendl; {(K <フィン)場合 端= K。 CNT = 1。 } そうであれば(K ==フィン){ CNT ++; } リターン; } 以下のために(INT I 0 =; I <ツリー[N] .child.size(); I ++){ layer_find(ツリー[N] .child [I])。 } } INTメイン(){ CIN >> N >> P >> R。 tree.resize(N) int型のA、B; {(; I <N I ++ INTがI = 0)するため cinを>>; 用(INT J = 0; J <; J ++){ cinを>> B; ツリー[I] .child.push_back(B)。 } } layer_init(); layer_find(0)。 printf( "%4lf%D"、フィン、CNT)。 0を返します。 }