SRM644 div.2 1000 TreeCutting
問題*1
- V頂点の木が与えられる
- 各頂点vにはnum[v]が与えられる(正の数もしくは-1)
- いくつかの枝を切断して以下のような木のみが存在する森をつくることはできるか
- 正のnumをもつ頂点はただ1つのみ
- その正の数字は木の頂点数と一致する
- 作れる場合はPOSSIBLE、作れない場合はIMPOSSIBLEという文字列を返す
解法
ここで説明する解法のアイデアは、「根付き木で葉から順番にnumを足していって、0になったとき枝を切断する」というものである
- まず、適当な頂点を根(ここでは頂点0)とした根付き木を作る
- また、各num[i]について、num[i] > 0のときは、num[i]--しておく
- 頂点vからDFSし、返り値を合計した値とnum[v]の値の和をDFSの値として返す
- 0からDFSした値が0のときはPOSSIBLEで、それ以外のときはIMPOSSIBLEである
計算量
O(|V|)
コード
最後に
一昨日は体調を崩して、昨日は眠かったから書けなかった