International Olympiad in Informatics 2011 |
GARDENバージョン: 1.5 |
植物学者の Somhed は, いくつかの学生グループをタイ最大級の熱帯植物園によく連れて行く. この植物園には N 個の噴水 (0, 1, ..., N-1の番号が付いている) があり, M 本の道で結ばれている. 各々の道は 2 つの異なる噴水を結んでおり, 結んでいる噴水の対はどの道についても異なる. 道はどちら向きにも通行可能である. また, どの噴水にも少なくとも 1 本の道が接続している. Somhed はこれらの道を彩る美しい植物を見たいと思っている. 各々のグループは植物園のどの噴水からでも歩き始めることができる.
Somhed は美しい熱帯植物が大好きなので, 彼と学生たちは現在いる噴水に接続する道のうちもっとも美しい道を選んで移動する. ただし, もっとも美しい道が直前に通った道であり, それ以外にも接続する道がある場合は, 2 番目に美しい道を選ぶ. 直前に通った道のみしか接続している道がない場合は, 今来た道を戻ることになる. Somhed はプロの植物学者なので, 彼にとってどの 2 本の道も同じ美しさではない.
学生たちは植物にはあまり興味がない. かわりに, 噴水 P にある高級レストランで昼食を食べたいと思っている. Somhed は, 学生たちがちょうど K 回の移動の後に腹を空かすということを知っている (ただし, K の値はグループごとに異なるかもしれない). Somhed は, 各々のグループに対し,次の条件をみたす経路がそれぞれどれだけあるのかが気になった:
噴水と道の情報が与えられたとき, Q 個の学生のグループについて (つまり, Q 個の K の値について), 答えの値を計算せよ.
次のパラメータをもつプロシージャー count_routes(N,M,P,R,Q,G) を実装せよ:
各 0 ≦ i < Q に対し, ちょうど G[i] 回の移動の後に噴水 P にいるような i 番目のグループの経路の個数 X を計算し, answer(X) を呼び出せ. 呼び出す順番はグループの順番と対応していなければならない. ただし条件をみたす経路がない場合は answer(0) を呼び出せ.
図 1 で, N=6, M=6, P=0, Q=1, G[0]=3,
R = |
|
道には美しい順に番号が付いているので, 道 0 がもっとも美しく, 道 1 が次に美しく, ...となっていることに注意せよ.
3 回の移動からなる可能な経路は次の 2 通りのみである.
よってこの場合, answer(2) を呼び出さなければならない.
図 2 で, N=5, M=5, P=2, Q=2, G[0]=3, G[1]=1,
R = |
|
1 つ目のグループについて, 3 回の移動の後に噴水 2 にいるような経路は 1 → 0 → 1 → 2 の 1 つしかない.
2 つ目のグループについて, 1 回の移動の後に噴水 2 にいるような経路は 3 → 2 と 4 → 2 の 2 つが考えられる.
よってこの場合, count_routes の正しい実装は, まず最初のグループ ( 0 番目のグループ) に対応する回答として answer(1) を呼び出し, それから次のグループ ( 1 番目のグループ) に対応する回答として answer(2) を呼び出さなければならない.
garden/
garden.c
または garden.cpp
または garden.pas
garden.h
または garden.pas
gardenlib.h
または gardenlib.pas
grader.c
または grader.cpp
または grader.pas
grader.in.1
, grader.in.2
, ...grader.expect.1
, grader.expect.2
, ...