题目传送门

 /*
题意:求一个点为根节点,使得到其他所有点的距离最短,是有向边,反向的距离+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. android framework navigationbar自定义

    需要实现的目标:在navigationbar上显示录像预览,并且点击按钮可以显示/隐藏NavigationBar 参考文章: http://blog.csdn.net/yanlai20/article ...

  2. 1085 数字游戏 2003年NOIP全国联赛普及组

    丁丁最近沉迷于一个数字游戏之中.这个游戏看似简单,但丁丁在研究了许多天之后却发觉原来在简单的规则下想要赢得这个游戏并不那么容易.游戏是这样的,在你面前有一圈整数(一共n个),你要按顺序将其分为m个部分 ...

  3. AtCoder Grand Contest 011 E - Increasing Numbers(灵性乱搞)

    题意: 当一个整数高位数字总不小于低位数字,或者说写成字符串之后单调不下降,称之为上升数.求一个整数最少能表示为多少个上升数的和.(n<=1e500000) 分析: 考虑那些不下降的数字,一定可 ...

  4. Ubuntu 16.04安装ntopng流量监控软件

    ntop官方在2012年就已经不再更新,取代的是ntopng.ntopng具有Web页面,适合做网络管理监控软件.比如监控局域网内多台机器的上网情况等. 不过这个东西感觉不太准,最好的方案应该把安装n ...

  5. redhat 6 配置 yum 源

    1.删除redhat原有的yum rpm -aq|grep yum|xargs rpm -e --nodeps 2.下载yum安装文件 注意,如果下载时找不到文件,就登录到:http://mirror ...

  6. JS中的apply、call、bind区别

    apply.call.bind 用法 1:作用 改变函数运行时的上下文,即改变this的指向问题. xxxFunction.call(this,arg1,arg2,arg3); xxxFunction ...

  7. some 算法

    矩阵变换:: 请用一条语句将: arr = [[1, 2, 3, 'a'], [4, 5, 6, 'b'], [7, 8, 9, 'c']] 转换装置矩阵为: [[1, 4, 7], [2, 5, 8 ...

  8. 怎样删除Tomcat下已经部署的项目

    lz说的是把web项目部署到tomcat之中,要把它删除..很简单,找到webapps文件(tomcat的根目录)下把它删除即可.. 2.Tomcat 6.0\webapps\项目名 只要在把这个目录 ...

  9. Linux学习系列之memcached

    memcached简介 一.memcached是什么 memcached是一个开源的.支持高性能.高并发的分布式内存缓存系统 mem+cache+daemon:分布式内存缓存守护进程 memcache ...

  10. 2011 ACM-ICPC 成都赛区A题 Alice and Bob (博弈动规)

    题目大意: 有K堆石子,每堆有Ki个.两人的操作能够是:             1 从某一堆拿走一个 假设该堆在此之后没有石子了.就消失             2 合并两个堆        求是否 ...