TopCoder SRM 603 Div1 Easy MaxMinTreeGame

問題

木が与えられる。各頂点には整数のコストが書かれている。
この木で二人が次のようなゲームをする。

  • 二人は交互に手番を繰り返す。
  • 手番のプレイヤーは辺を一つ選んで切断し、木を二つに分ける。一方の木を完全に消滅させる。
  • 木が頂点一つになったら終了し、それが二人の得点となる。
  • 先手は得点を最大化し、後手は得点を最小化する。


互いがベストを尽くすとき、得られる得点を求めよ。

制約条件

頂点≦50
コスト≦10億

方針

一直線のグラフで考えると、両端のうちコストの大きいノードのコストが答え。
何故なら、先手は大きい方のノードを残して初手で終了させることができるので、
ベストを尽くしたときの得点は必ず大きいノード以上になる。


初手で大きいノード取らなかった場合、後手は大きいノードを取って終了させることができるので、ベストを尽くしたときの得点は必ず大きいノード以下になる。


これと全く同じ議論が木でも適用できて、葉のノードのうち最大のコストが答え。

ソースコード

class MaxMinTreeGame {
	public:
	int findend(vector <int> edges, vector <int> costs) {
		int n = costs.size();
		int deg[50] = {}, ans = 0;
		
		rep(i, n - 1){
			deg[i + 1]++;
			deg[edges[i]]++;
		}
		rep(i, n) if(deg[i] == 1) ans = max(ans, costs[i]);
		return ans;
	}
};