题目传送门

 /*
题意:求一个点为根节点,使得到其他所有点的距离最短,是有向边,反向的距离+1
树形DP:首先假设1为根节点,自下而上计算dp[1](根节点到其他点的距离),然后再从1开始,自上而下计算dp[v],
此时可以从上个节点的信息递推出来
*/
#include <cstdio>
#include <cstring>
#include <cmath>
#include <vector>
using namespace std; const int MAXN = 2e5 + ;
const int INF = 0x3f3f3f3f;
struct Edge {
int v, w;
};
vector<Edge> G[MAXN];
int dp[MAXN];
bool vis[MAXN];
int n, res; void DFS(int u) {
vis[u] = true;
for (int i=; i<G[u].size (); ++i) {
int v = G[u][i].v, w = G[u][i].w;
if (vis[v]) continue;
DFS (v);
res += w;
}
} void DFS2(int u) {
vis[u] = true;
for (int i=; i<G[u].size (); ++i) {
int v = G[u][i].v, w = G[u][i].w;
if (vis[v]) continue;
if (w == ) dp[v] = dp[u] + ;
else dp[v] = dp[u] - ;
DFS2 (v);
}
} void work(void) {
memset (vis, false, sizeof (vis));
memset (dp, , sizeof (dp)); res = ; DFS (); dp[] = res;
memset (vis, false, sizeof (vis));
DFS2 (); int mn = INF, p = ;
for (int i=; i<=n; ++i) {
if (mn >= dp[i]) {
mn = dp[i]; p = i;
}
}
printf ("%d\n", mn);
for (int i=; i<=n; ++i) {
if (i == p) {
printf ("%d\n", i); break;
}
if (dp[i] == mn) printf ("%d ", i);
}
} int main(void) { //Codeforces Round #135 (Div. 2) D. Choosing Capital for Treeland
// freopen ("A.in", "r", stdin); while (scanf ("%d", &n) == ) {
for (int i=; i<=n; ++i) G[i].clear ();
for (int i=; i<=n-; ++i) {
int u, v; scanf ("%d%d", &u, &v);
G[u].push_back ((Edge) {v, });
G[v].push_back ((Edge) {u, });
} work ();
} return ;
}

树形DP Codeforces Round #135 (Div. 2) D. Choosing Capital for Treeland的更多相关文章

  1. Codeforces Round #135 (Div. 2) D. Choosing Capital for Treeland dfs

    D. Choosing Capital for Treeland time limit per test 3 seconds memory limit per test 256 megabytes i ...

  2. Codeforces Round #135 (Div. 2) D - Choosing Capital for Treeland(两种树形DP)

  3. Codeforces Round #135 (Div. 2) D. Choosing Capital for Treeland

    time limit per test 3 seconds memory limit per test 256 megabytes input standard input output standa ...

  4. 树形dp - Codeforces Round #322 (Div. 2) F Zublicanes and Mumocrates

    Zublicanes and Mumocrates Problem's Link Mean: 给定一个无向图,需要把这个图分成两部分,使得两部分中边数为1的结点数量相等,最少需要去掉多少条边. ana ...

  5. 树形dp Codeforces Round #364 (Div. 1)B

    http://codeforces.com/problemset/problem/700/B 题目大意:给你一棵树,给你k个树上的点对.找到k/2个点对,使它在树上的距离最远.问,最大距离是多少? 思 ...

  6. 构造 Codeforces Round #135 (Div. 2) B. Special Offer! Super Price 999 Bourles!

    题目传送门 /* 构造:从大到小构造,每一次都把最后不是9的变为9,p - p MOD 10^k - 1,直到小于最小值. 另外,最多len-1次循环 */ #include <cstdio&g ...

  7. 贪心 Codeforces Round #135 (Div. 2) C. Color Stripe

    题目传送门 /* 贪心:当m == 2时,结果肯定是ABABAB或BABABA,取最小改变量:当m > 2时,当与前一个相等时, 改变一个字母 同时不和下一个相等就是最优的解法 */ #incl ...

  8. DP Codeforces Round #303 (Div. 2) C. Woodcutters

    题目传送门 /* 题意:每棵树给出坐标和高度,可以往左右倒,也可以不倒 问最多能砍到多少棵树 DP:dp[i][0/1/2] 表示到了第i棵树时,它倒左或右或不动能倒多少棵树 分情况讨论,若符合就取最 ...

  9. DP Codeforces Round #260 (Div. 1) A. Boredom

    题目传送门 /* 题意:选择a[k]然后a[k]-1和a[k]+1的全部删除,得到点数a[k],问最大点数 DP:状态转移方程:dp[i] = max (dp[i-1], dp[i-2] + (ll) ...

随机推荐

  1. 【spring boot 系列】spring data jpa 全面解析(实践 + 源码分析)

    前言 本文将从示例.原理.应用3个方面介绍spring data jpa. 以下分析基于spring boot 2.0 + spring 5.0.4版本源码 概述 JPA是什么? JPA (Java ...

  2. 单调队列&单调栈 基础

    参考博客https://www.cnblogs.com/tham/p/8038828.html 例题  poj 2823 Sliding Window Time Limit: 12000MS   Me ...

  3. Ice Cave-CodeForces(广搜)

    链接:http://codeforces.com/problemset/problem/540/C You play a computer game. Your character stands on ...

  4. Maximum Product Subarray(最大连续乘积子序列)

    Find the contiguous subarray within an array (containing at least one number) which has the largest ...

  5. java基础标识符,关键字,常量

    1关键字1.1关键字的概述Java的关键字对java的编译器有特殊的意义,他们用来表示一种数据类型,或者表示程序的结构等,关键字不能用作变量名.方法名.类名.包名.2标识符2.1什么是标识符就是程序员 ...

  6. Spring集成Redis方案(spring-data-redis)(基于Jedis的单机模式)(待实践)

    说明:请注意Spring Data Redis的版本以及Spring的版本!最新版本的Spring Data Redis已经去除Jedis的依赖包,需要自行引入,这个是个坑点.并且会与一些低版本的Sp ...

  7. 在虚拟机搭建JStrom

    原文:http://blog.csdn.net/u014134180/article/details/51810311 一 安装步骤 二 搭建Zookeeper集群 1 ZooKeeper 单机安装与 ...

  8. openWrt 安装管理界面luci中文包

    openWrt15安装管理界面luci中文包   如果刚刷的openwrt15没有中文界面,用ssh连接路由后用opkg安装     root@bang-bang-tang:~# opkg insta ...

  9. c++11中的线程、锁和条件变量

    void func(int i, double d, const string& s) { cout << i << ", " << d ...

  10. netty4与protocol buffer结合简易教程

    各项目之间通常使用二进制进行通讯,占用带宽小.处理速度快~ 感谢netty作者Trustin Lee.让netty天生支持protocol buffer. 本实例使用netty4+protobuf-2 ...