[CF219D]Choosing Capital for Treeland(树dp)
2016-08-28 14:24
387 查看
题目链接:http://codeforces.com/problemset/problem/219/D
题意:一张有向图上有n个点n-1条边,现在要求把这个图上的几个边的方向倒置,使得所有点都能到达同一个点。求最小需要翻转多少条边
把这张图转换成带权的无向图,原始的方向上权值是1,加一条反向边权值是0。这样就转换成了求一个点,使得从这个点出发到达所有点的权值和最大的问题了。
先预处理以点1为树根的各点到其子树各点的权值和,再算以其他点为根,到其他各点的权值和。即翻转当前节点和其父亲节点相连的那条边,并把父亲到各个节点的距离加上(要减去父亲到自己的边权)。
题意:一张有向图上有n个点n-1条边,现在要求把这个图上的几个边的方向倒置,使得所有点都能到达同一个点。求最小需要翻转多少条边
把这张图转换成带权的无向图,原始的方向上权值是1,加一条反向边权值是0。这样就转换成了求一个点,使得从这个点出发到达所有点的权值和最大的问题了。
先预处理以点1为树根的各点到其子树各点的权值和,再算以其他点为根,到其他各点的权值和。即翻转当前节点和其父亲节点相连的那条边,并把父亲到各个节点的距离加上(要减去父亲到自己的边权)。
/* ━━━━━┒ギリギリ♂ eye! ┓┏┓┏┓┃キリキリ♂ mind! ┛┗┛┗┛┃\○/ ┓┏┓┏┓┃ / ┛┗┛┗┛┃ノ) ┓┏┓┏┓┃ ┛┗┛┗┛┃ ┓┏┓┏┓┃ ┛┗┛┗┛┃ ┓┏┓┏┓┃ ┛┗┛┗┛┃ ┓┏┓┏┓┃ ┃┃┃┃┃┃ ┻┻┻┻┻┻ */ #include <algorithm> #include <iostream> #include <iomanip> #include <cstring> #include <climits> #include <complex> #include <fstream> #include <cassert> #include <cstdio> #include <bitset> #include <vector> #include <deque> #include <queue> #include <stack> #include <ctime> #include <set> #include <map> #include <cmath> using namespace std; #define fr first #define sc second #define cl clear #define BUG puts("here!!!") #define W(a) while(a--) #define pb(a) push_back(a) #define Rint(a) scanf("%d", &a) #define Rs(a) scanf("%s", a) #define Cin(a) cin >> a #define FRead() freopen("in", "r", stdin) #define FWrite() freopen("out", "w", stdout) #define Rep(i, len) for(int i = 0; i < (len); i++) #define For(i, a, len) for(int i = (a); i < (len); i++) #define Cls(a) memset((a), 0, sizeof(a)) #define Clr(a, x) memset((a), (x), sizeof(a)) #define Full(a) memset((a), 0x7f7f, sizeof(a)) #define lp p << 1 #define rp p << 1 | 1 #define pi 3.14159265359 #define RT return #define lowbit(x) x & (-x) #define onenum(x) __builtin_popcount(x) typedef long long LL; typedef long double LD; typedef unsigned long long ULL; typedef pair<int, int> pii; typedef pair<string, int> psi; typedef map<string, int> msi; typedef vector<int> vi; typedef vector<LL> vl; typedef vector<vl> vvl; typedef vector<bool> vb; const int maxn = 200200; int n, m; vector<pii> G[maxn]; int dp1[maxn], dp2[maxn]; void dfs1(int u, int p) { Rep(i, G[u].size()) { int v = G[u][i].first; int w = G[u][i].second; if(v == p) continue; dfs1(v, u); dp1[u] += dp1[v] + w; } } void dfs2(int u, int p) { Rep(i, G[u].size()) { int v = G[u][i].first; int w = G[u][i].second; if(v == p) continue; dp2[v] += dp2[u] + dp1[u] - dp1[v] - w + !w; dfs2(v, u); } } bool cmp(pii a, pii b) { if(a.first == b.first) return a.second < b.second; return a.first > b.first; } int main() { // FRead(); int u, v; while(~Rint(n)) { For(i, 1, n+1) G[i].clear(); Cls(dp1); Cls(dp2); Rep(i, n-1) { Rint(u); Rint(v); G[u].push_back(pii(v, 1)); G[v].push_back(pii(u, 0)); } dfs1(1, 0); dfs2(1, 0); vector<pii> ret; pii tmp; For(i, 1, n+1) { tmp.first = dp1[i] + dp2[i]; tmp.second = i; ret.push_back(tmp); } sort(ret.begin(), ret.end(), cmp); int ans = n - 1 - ret[0].first; int cnt = 1; For(i, 1, ret.size()) { if(ret[i].first == ret[0].first) cnt++; } printf("%d\n", ans); Rep(i, cnt) printf("%d ", ret[i].second); printf("\n"); } RT 0; }
相关文章推荐
- 树形DP Codeforces Round #135 (Div. 2) D. Choosing Capital for Treeland
- [codeforces 219D] Choosing Capital for Treeland (树形dp)
- E - Choosing Capital for Treeland (树形dp)
- CF#219 D. Choosing Capital for Treeland(树形DP)
- Codeforces 219D - Choosing Capital for Treeland(树形dp)
- Choosing Capital for Treeland (树形dp)
- CodeForces D. Choosing Capital for Treeland (转化为树形DP)
- [CF 219D]Choosing Capital for Treeland[树形DP]
- CF 219 D:Choosing Capital for Treeland(树形dp)
- 【codeforce 219D】 Choosing Capital for Treeland (树形DP)
- Choosing Capital for Treeland (树形dp+双向搜索)
- codeforces 219D D. Choosing Capital for Treeland(树形dp)
- CodeForces 219D-Choosing Capital for Treeland(树形dp)
- CF_D. Choosing Capital for Treeland_树形DP
- Codeforces Round #135 (Div. 2) - D. Choosing Capital for Treeland(dfs / 树形DP)
- CF 219 D Choosing Capital for Treeland(树形dp)
- cf 135div2D Choosing Capital for Treeland 【树形dp】
- Codeforces Round #135 (Div. 2)-D. Choosing Capital for Treeland
- Codeforces Round #135 (Div. 2) D. Choosing Capital for Treeland dfs
- CodeForces 219D-H - Choosing Capital for Treeland-树DP