Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

rerooting-dp.hpp #120

Open
wants to merge 12 commits into
base: main
Choose a base branch
from
Open

rerooting-dp.hpp #120

wants to merge 12 commits into from

Conversation

@shogo314
Copy link
Member Author

方針について

抽象化の仕方は基本的に
https://trap.jp/post/1702/
と同じです。
汎用性を高めるために辺番号と頂点番号を受け取る形にしています。これはAuxiliary Treeを受け取り、注目している頂点かわかるようにしたいといった需要を想定しています。さらに、情報量的には本来不要ですが、利用時に実装をシンプルにするために辺の重みも受け取るようにしました。
簡単な実装を優先するため、mergeなどの関数が2倍程度多く呼び出されています。具体的には前半で木DPをしたあと、後半で累積和を用いていい感じにしていますが、累積和は前半パートで求めてもいいです。
辺番号と頂点番号は、lazy-segtreeみたいに受け取らない関数も許容する形にしてもいいと思っています。

Costについて

weighted, unweightedでわけてもいい気がしています。

下に並べてる具体的な関数について

ただでさえややこしいので、具体化した関数はいろいろ提供していいと思っています。
EDPCのdp_vとかは全然なくてもいい気がする反面、EDPCだしあってもええやろの気持ちで書いてます。
これらの関数について、適当な名前空間に入れた方がいい気もしています。

@Raclamusi
Copy link
Contributor

rerooting_dp() で、テンプレート引数 V を指定するために引数から推論できるはずのテンプレート引数 E も明示的に書かなきゃいけない、みたいな場面が多そうです。

return rerooting_dp<Cost, Cost>(

auto tmp = rerooting_dp<P, P>(

template <typename V, typename E, ...> のように、 EV の順序を逆にすると rerooting_dp<T>(...) のように書けますが、どうですか?
もしくは、 template <typename E, typename V = E, ...> のように、 V にデフォルト引数を与えると、 EV が等しいときに rerooting_dp(...) のように書けますが、どうですか?

@shogo314
Copy link
Member Author

Costは省略されることを前提に設計していましたが、確かにEも省略できますね。
ほとんどの場面においてE==Vなので後者のほうで書きます。

Copy link
Contributor

@KowerKoint KowerKoint left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

コメントが大変遅れてしまいました…
Costとかidを省略できるといいですが、いろいろ省略できるようになると少ない引数での呼び出しがどの順番になるのかよくわからなくなりそうなので、どちらでも良いと思います

for (int u : rooted.preorder) {
const auto& ch = rooted.child[u];
std::vector<E> ri(ch.size() + 1, e);
for (size_t i = ch.size(); i > 0; i--) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

結構どうでもいいんですが、C言語のsize_tよりC++のstd::size_tを使いたい

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants