【CF】135 Div2 Choosing Capital for Treeland

树形结构,挺有意思的题目。不难。

  1 /* 219D */
  2 #include <iostream>
  3 #include <string>
  4 #include <map>
  5 #include <queue>
  6 #include <set>
  7 #include <stack>
  8 #include <vector>
  9 #include <deque>
 10 #include <algorithm>
 11 #include <cstdio>
 12 #include <cmath>
 13 #include <ctime>
 14 #include <cstring>
 15 #include <climits>
 16 #include <cctype>
 17 #include <cassert>
 18 #include <functional>
 19 #include <iterator>
 20 #include <iomanip>
 21 using namespace std;
 22 //#pragma comment(linker,"/STACK:102400000,1024000")
 23
 24 #define sti                set<int>
 25 #define stpii            set<pair<int, int> >
 26 #define mpii            map<int,int>
 27 #define vi                vector<int>
 28 #define pii                pair<int,int>
 29 #define vpii            vector<pair<int,int> >
 30 #define rep(i, a, n)     for (int i=a;i<n;++i)
 31 #define per(i, a, n)     for (int i=n-1;i>=a;--i)
 32 #define clr                clear
 33 #define pb                 push_back
 34 #define mp                 make_pair
 35 #define fir                first
 36 #define sec                second
 37 #define all(x)             (x).begin(),(x).end()
 38 #define SZ(x)             ((int)(x).size())
 39 #define lson            l, mid, rt<<1
 40 #define rson            mid+1, r, rt<<1|1
 41
 42 const int maxn = 2e5+5;
 43 int D[maxn];
 44 int W[maxn], sw;
 45 int W_[maxn];
 46 vpii E[maxn];
 47 vi vc;
 48 int ans;
 49 int n;
 50
 51 void dfs(int u, int fa, int w_, int d) {
 52     int v, w;
 53
 54     D[u] = d;
 55     W_[u] = w_;
 56     rep(i, 0, SZ(E[u])) {
 57         v = E[u][i].fir;
 58         w = E[u][i].sec;
 59         if (v == fa)
 60             continue;
 61         dfs(v, u, w_+w, d+1);
 62         W[u] += W[v] + w;
 63     }
 64 }
 65
 66 void solve() {
 67     // calculate w & c
 68     dfs(1, -1, 0, 0);
 69     ans = sw = W[1];
 70     vc.pb(1);
 71
 72     // calculate the minimum cost
 73     int tmp;
 74
 75     rep(i, 2, n+1) {
 76         tmp = sw - W_[i] + D[i] - W_[i];
 77         if (tmp == ans) {
 78             vc.pb(i);
 79         } else if (tmp < ans) {
 80             vc.clear();
 81             ans = tmp;
 82             vc.pb(i);
 83         }
 84     }
 85
 86     printf("%d\n", ans);
 87     rep(i, 0, SZ(vc))
 88         printf("%d ", vc[i]);
 89     putchar(‘\n‘);
 90 }
 91
 92 int main() {
 93     ios::sync_with_stdio(false);
 94     #ifndef ONLINE_JUDGE
 95         freopen("data.in", "r", stdin);
 96         freopen("data.out", "w", stdout);
 97     #endif
 98
 99     int u, v;
100
101     scanf("%d", &n);
102     rep(i, 1, n) {
103         scanf("%d %d", &u, &v);
104         E[u].pb(mp(v, 0));
105         E[v].pb(mp(u, 1));
106     }
107
108     solve();
109
110     #ifndef ONLINE_JUDGE
111         printf("time = %d.\n", (int)clock());
112     #endif
113
114     return 0;
115 }
时间: 2024-10-12 12:49:21

【CF】135 Div2 Choosing Capital for Treeland的相关文章

【CF】323 Div2. D. Once Again...

挺有意思的一道题目.考虑长度为n的数组,重复n次,可以得到n*n的最长上升子序列.同理,也可以得到n*n的最长下降子序列.因此,把t分成prefix(上升子序列) + cycle(one integer repeating) + sufix(下降子序列).当t<=2*n时,暴力解.注意数据范围. 1 /* 583D */ 2 #include <iostream> 3 #include <string> 4 #include <map> 5 #include &l

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

题目传送门 1 /* 2 题意:求一个点为根节点,使得到其他所有点的距离最短,是有向边,反向的距离+1 3 树形DP:首先假设1为根节点,自下而上计算dp[1](根节点到其他点的距离),然后再从1开始,自上而下计算dp[v], 4 此时可以从上个节点的信息递推出来 5 */ 6 #include <cstdio> 7 #include <cstring> 8 #include <cmath> 9 #include <vector> 10 using name

【TopCoder】SRM151 DIV2 练习总结

第一次做完整的SRM题,刷完感觉萌萌哒,不过自己对java中很多细节不熟练,还要边做题边google. 250分的题:判断字符串序列是否是前缀码,如果不是,返回第一个违反前缀码规则的字符串. 简单的暴力方法,要积累的是java中startsWith的用法: 1 public boolean startsWith(String prefix) 如果prefix是调用该函数的字符串的前缀,返回true,否则返回false.从实际经验来看,对大小写是敏感的,即No不是not的前缀. 完整代码连接:Gi

【SRM】600#div2 B 枚举

题意:有一个集合和一个目标态goal,现在的状态是X=0,现在在集合中有一些数,经过每次X=X|a[i] 这种异或运算后,能使得X=goal,即达到目标态.问:最少删除集合中多少个元素,使得初始X=0,不能达到目标态. 思路:SRM600 #div2 的A题做了好一会儿,主要是不知道怎么直接计算出那个shuttle的数量,突然发现暴力枚举可行. 因此做B题的时候也受枚举思想的影响.刚开始我想枚举子集再决定删除多少个,但真不好决定.接着又想枚举goal的每一位(二进制),显然可行!但是由于思路不严

【CF】38E Let&#39;s Go Rolling! (dp)

前言 这题还是有点意思的. 题意: 给你 \(n\) (\(n<=3000\)) 个弹珠,它们位于数轴上.给你弹珠的坐标 \(x_i\) 在弹珠 \(i\) 上面花费 \(C_i\) 的钱 可以使弹珠在原地不动 (\(-10^9<=x_i,C_i<=10^9\)),游戏开始时,所有的弹珠向左滚动,直到碰到定在原地不动的弹珠,其花费是其滚动的距离.总花费=开始前的花费+弹珠滚动的花费,问最小的花费是多少 题解 首先划分出阶段,,我们可以先将弹珠排序,前 \(i\) 个弹珠,最后一个固定的弹

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 input standard input output standard output The country Treeland consists of n cities, some pairs of them are connected with unidirectional roads. Over

(纪念第一道完全自己想的树DP)CodeForces 219D Choosing Capital for Treeland

Choosing Capital for Treeland time limit per test 3 seconds memory limit per test 256 megabytes input standard input output standard output The country Treeland consists of n cities, some pairs of them are connected with unidirectional roads. Overall

【CF】codeforces round 369(div2)

*明早起来再贴代码 A [题意] 给定n*5的方格 将横向的相邻两个变成+输出   [题解] ...   B [题意] 一个n*n的正整数矩阵,有且仅有一个数为0 ,在这个位置填上一个数,使得每一列的和 每一行的和 两条对角线各自的和都相等 输出这个数   [题解]sb题.暴力一下.注意细节,否则你就像这样 (不是本人   C [题意] 一排点,用1~n表示,熊孩子要给这些点上色.最初每个点的颜色为ci.一共有m种颜色,如果ci=0表示这个点最初无色. 熊孩子们需要给最初为无色的点涂上色,往第i

Choosing Capital for Treeland codeforce 219-D

The country Treeland consists of n cities, some pairs of them are connected with unidirectional roads. Overall there are n?-?1 roads in the country. We know that if we don't take the direction of the roads into consideration, we can get from any city