博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
bzoj 1131 简单树形dp
阅读量:4935 次
发布时间:2019-06-11

本文共 1453 字,大约阅读时间需要 4 分钟。

思路:随便想想就能想出来啦把。。。  卡了我一个vector。。。

#include
#define LL long long#define fi first#define se second#define mk make_pair#define pii pair
#define piii pair
>using namespace std;const int N = 1e6 + 10;const int M = 10 + 7;const int inf = 0x3f3f3f3f;const LL INF = 0x3f3f3f3f3f3f3f3f;const int mod = 1e9 + 7;const double eps = 1e-6;int n, tot, head[N];LL cnt[N], sum[N], dp[N];struct Edge { int to, nx;} edge[N << 1];void add(int u, int v) { edge[tot].to = v; edge[tot].nx = head[u]; head[u] = tot++;}void dfs1(int u, int p) { cnt[u] = 1; for(int i = head[u]; ~i; i = edge[i].nx) { int v = edge[i].to; if(v == p) continue; dfs1(v, u); cnt[u] += cnt[v]; sum[u] += sum[v] + cnt[v]; }}void dfs2(int u, int p) { if(p) { dp[u] = sum[u] + (dp[p] - (sum[u] + cnt[u]) + n - cnt[u]); } for(int i = head[u]; ~i; i = edge[i].nx) { int v = edge[i].to; if(v == p) continue; dfs2(v, u); }}int main() { memset(head, -1, sizeof(head)); scanf("%d", &n); for(int i = 1; i < n; i++) { int u, v; scanf("%d%d", &u, &v); add(u, v); add(v, u); } dfs1(1, 0); dp[1] = sum[1]; dfs2(1, 0); int ans = 1; for(int i = 1; i <= n; i++) { if(dp[ans] < dp[i]) { ans = i; } } printf("%d\n", ans); return 0;}/**/

 

转载于:https://www.cnblogs.com/CJLHY/p/9183525.html

你可能感兴趣的文章
Java基础学习 —— 线程
查看>>
【32】确定你的public继承塑模出Is-A关系
查看>>
【23】宁以non-member、non-friend替换member函数
查看>>
游戏的物理和数学:弹道和移动目标提前量计算
查看>>
pyinstaller
查看>>
蓝桥杯_基础训练_完美的代价(贪心)
查看>>
oracle-hr表查询命令练习(超完整的select命令大全)
查看>>
Qt快速入门之二:Qt Creator简介
查看>>
Sqlerver_各类函数
查看>>
[转]cocos2d-x添加广告条(IOS and Android)
查看>>
BZOJ4003: [JLOI2015]城池攻占
查看>>
猴子选大王 (约瑟夫环)(c#)
查看>>
css3 之border-radius 属性解析
查看>>
访存模型
查看>>
四则运算之C++版
查看>>
文本框测试用例
查看>>
前端,我为什么不要你
查看>>
用Python作GIS之四:Tkinter基本界面的搭建
查看>>
实用小项目——Vue.js 实现增删查改功能
查看>>
oracle
查看>>