予備役将校訓練部隊のピクニック
アルゴリズムデザインにのっていた問題。
本当は動的計画法を使うらしいけど、よく分からないので、BFSした。
問題
木が与えられる。この木の根から情報を発信する。情報は、時間1の間に各ノードから
そのノードの1つの子ノードにしか送ることができない。
情報を一番早く木全体に伝わるように伝えた場合、時間はどれだけかかるだろうか。
解法
頂点vを根とする木で、vの子を C1,C2,C3,...,Cn とする。
また、f(u) = (頂点uを根とする木全体に情報が伝達されるのにかかる時間) とする。
f(v) = min(f(i) | i = 1,2,3,..,n ) + n
となる。
計算量は、合計人数をNとすると、O(N)である。たぶん。
入力
N
m1 c1 c2 ... cm
m2 c1 c2 ... cm
:
:
mN c1 c2 ... cm
Nは合計人数。続くN行にi(0<=i
#include <cstdio> #include <algorithm> using namespace std; const int INF = 1 << 29; const int MAX_N = 100; bool G[MAX_N][MAX_N]; //G[i][j] == true iはjの上司である int N; //合計人数 int solve(int p){ int buka_n = 0; int time = INF; for(int i = 0; i < N; i++){ if(G[p][i] == true){ buka_n++; time = min(time, solve(i)); } } if(time == INF) return 0; else return time + buka_n; } int main(){ scanf("%d", &N); for(int i = 0; i < N; i++) for(int j = 0; j < N; j++) G[i][j] = false; for(int i = 0; i < N; i++){ int buka_n; scanf("%d", &buka_n); for(int j = 0; j < buka_n; j++){ int p; scanf("%d", &p); G[i][p] = true; } } printf("%d\n", solve(0)); return 0; }