CodeForces - 219D Choosing Capital for Treeland——树形dp

网友投稿 206 2022-09-13

CodeForces - 219D Choosing Capital for Treeland——树形dp

类似于树上每个点的最远距离那种思路,两遍dfs,一遍求儿子的反转个数,另一个求父亲的反转个数(中间会用到兄弟),最后结果为两部分相加

#include #include #include #include using namespace std;const int INF = 0x3f3f3f3f;const int maxn = 2 * 1e5 + 10;int n, tot, head[maxn];struct Edge { int to, flag, next;}edge[maxn<<1];void init() { tot = 0; memset(head, -1, sizeof(head));}void addedge(int u, int v, int flag) { ++tot; edge[tot].to = v, edge[tot].flag = flag, edge[tot].next = head[u]; head[u] = tot;}int dp[maxn][2];void dfs1(int u, int p) { for (int i = head[u]; i != -1; i = edge[i].next) { int v = edge[i].to, flag = edge[i].flag; if (v == p) continue; dfs1(v, u); dp[u][0] += dp[v][0] + (flag ? 0 : 1); }}void dfs2(int u, int p) { for (int i = head[u]; i != -1; i = edge[i].next) { int v = edge[i].to, flag = edge[i].flag; if (v == p) continue; dp[v][1] = dp[u][1] + (flag ? dp[u][0] - dp[v][0] + 1 : dp[u][0] - dp[v][0] - 1); dfs2(v, u); }}int main() { scanf("%d", &n); init(); int u, v; for (int i = 1; i <= n - 1; i++) { scanf("%d %d", &u, &v); addedge(u, v, 1); addedge(v, u, 0); } memset(dp, 0, sizeof(dp)); dfs1(1, -1); dfs2(1, -1);// for (int i = 1; i <= n; i++) cout << dp[i][0] << " ";// cout << endl;// for (int i = 1; i <= n; i++) cout << dp[i][1] << " ";// cout << endl; int ans = INF, flag = 0; for (int i = 1; i <= n; i++) ans = min(ans, dp[i][0] + dp[i][1]); printf("%d\n", ans); for (int i = 1; i <= n; i++) { if (dp[i][0] + dp[i][1] == ans) { if (flag++) printf(" "); printf("%d", i); } } return 0;}

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:上汽大众首款纯电SUV上市 杨嗣耀:一年三车、创新营销!
下一篇:HDU 4725 The Shortest Path in Nya Graph——建图+dijkstra
相关文章

 发表评论

暂时没有评论,来抢沙发吧~