F - Centipede Graph 解説 by kyopro_friends

全方位木DP(rerooting DP)

ムカデグラフのベースとなるパスの端点のことを、そのムカデグラフの端点と呼ぶことにします。

この問題を「根がバーチャルである根付き木」を管理する抽象化全方位木DPライブラリを用いて解きます。

根がバーチャルである根付き木に対して、「根を含まず、根の直接の子を端点の一方とする部分ムカデグラフの大きさの最大値」の情報を持ちます。

根がバーチャルな根付き木同士のマージはmaxで行え、根とそのバーチャルな親の追加は、根の次数で場合分けすることで実装できます。

実装イメージ

using vtree=int;
using tree=int;
vtree merge_vtree(vtree x, vtree y){
	//根がバーチャルな根付き木同士をマージする関数
	return max(x,y);
}

vtree add_e(vtree x, edge&e){
	//根がバーチャルな根付き木に、根となる頂点と、その頂点から新たなバーチャルな根への辺を追加する
	if(deg[e.from]>=4)return x+1;
	if(deg[e.from]>=3)return 1;
	return 0;
}

tree add_v(vtree x, int vi){
	//根がバーチャルな根付き木に、根となる頂点を追加する
	if(deg[vi]>=3)return x+1;
	if(deg[vi]>=2)return 1;
	return 0;
}

投稿日時:
最終更新: