博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[BZOJ1040][P2607][ZJOI2008]骑士[树形DP+基环树]
阅读量:7112 次
发布时间:2019-06-28

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

做法跟没有上司的舞会差不多,只要把环上的任两点之间断开,从断开的两点分别为起点跑一次树形dp,然后取max就行了

几个坑点:

1.可能有多个连通块,每个连通块都是一个基环树

2.断环的时候没想到什么方法。。。后来用vector暴力找的。。。

3.爆int

4.代码里有个小地方,加了注释

常数极大,不加fread luogu会TLE一个点

#include 
using namespace std;const int MAXN = 1e6+7;vector
G[MAXN]; bool vis[MAXN]; int x, y;char buf[15<<20], *p1 = buf;#define getchar() (*p1++)inline void read(int &x) { register int c = getchar(), f = 1; x = 0; while(!isdigit(c)) (c=='-')&&(f=-1), c = getchar(); while(isdigit(c)) x = x * 10 + c - '0', c = getchar(); x *= f;}inline void add(int u, int v) { G[u].push_back(v), G[v].push_back(u);}int v[MAXN], n, m;long long dp[MAXN][2];void get(int u, int fa=0) { if (vis[u]) return x = u, y = fa, void(); vis[u] = 1; for(vector
::iterator it = G[u].begin(); it != G[u].end(); ++it) { if (*it == fa) continue; get(*it, u); }} void treedp(int u, int fa=0) { if (!u) return ; dp[u][1] = v[u], dp[u][0] = 0; for(vector
::iterator it = G[u].begin(); it != G[u].end(); ++it) { if (*it == fa) continue; treedp(*it, u); dp[u][0] += max(dp[*it][0], dp[*it][1]); dp[u][1] += dp[*it][0]; }}int main(void) { fread(buf, 1, 15<<20, stdin); read(n); for(int to, i = 1; i <= n; ++i) { read(v[i]), read(to); add(i, to); } long long Ans = 0; for(int i = 1; i <= n; ++i) { if (vis[i]) continue; get(i); for(int j = 0; j < G[x].size(); ++j) if (G[x][j] == y) {G[x][j] = 0; break;} for(int j = 0; j < G[y].size(); ++j) if (G[y][j] == x) {G[y][j] = 0; break;} treedp(x); long long tmp = dp[x][0];//必须存起来,不然treedp[y]的时候dp[x][0]就变了 treedp(y); Ans += max(tmp, dp[y][0]); } cout << Ans; return 0;}

转载于:https://www.cnblogs.com/storz/p/10191369.html

你可能感兴趣的文章
CISCO ASA5505 如何清空配置 ZZ
查看>>
solr学习之(七)_学习solr的理由(solr的特点和应用领域)
查看>>
RedHat下MySQL 5.6 安装、维护
查看>>
vim+vimgdb的办法
查看>>
在Windows上安装TensorFlow
查看>>
linux环境变量
查看>>
苹果将从OS X 10.8开始将放弃X11,敦促用户使用开源的XQuartz
查看>>
Python的学习笔记15------序列化
查看>>
数据库表循环获取 迭代获取
查看>>
Twitter zipkin 分布式跟踪系统的设计与实现
查看>>
Mysql Partition分区(理论)
查看>>
CSS纯英文数字自动换行
查看>>
关于lm-sensors中i8k.c的研究
查看>>
AEAI ESB路由转换机制说明
查看>>
<Hibernate>异常
查看>>
centos搭建svn服务器
查看>>
android解析xml文件的方式(其一)
查看>>
正则表达式常用函数:匹配/查找替换/分割等
查看>>
Python科学计算 第二版
查看>>
【讲古堂】表达式求值
查看>>