当前位置: 首页 > news >正文

[BZOJ1040][P2607][ZJOI2008]骑士[树形DP+基环树]

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

几个坑点:

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

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

3.爆int

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

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

#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e6+7;
vector<int>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<int>::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<int>::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

相关文章:

  • java Concurrent包学习笔记(六):Exchanger
  • 理解 Web 中的Session
  • bzoj3295: [Cqoi2011]动态逆序对
  • 北大、微软提出NGra:高效大规模图神经网络计算
  • SQL Server事务日志管理的进阶,第5级:在完全恢复模式下管理日志
  • zabbix3.4 端口和进程监控配置
  • Java 面试之技术框架
  • db cursor
  • Kubeflow 公布 1.0 路线图:2019 年实现 API 稳定
  • Finale
  • String不得不说的那些事
  • 利用React 16.6新特性优化应用性能
  • ajax的19道经典面试题
  • 大数据就业前景,分析的太到位了
  • (原創) 如何優化ThinkPad X61開機速度? (NB) (ThinkPad) (X61) (OS) (Windows)
  • JavaScript-如何实现克隆(clone)函数
  • 【407天】跃迁之路——程序员高效学习方法论探索系列(实验阶段164-2018.03.19)...
  • echarts花样作死的坑
  • FastReport在线报表设计器工作原理
  • happypack两次报错的问题
  • JavaSE小实践1:Java爬取斗图网站的所有表情包
  • java中具有继承关系的类及其对象初始化顺序
  • js正则,这点儿就够用了
  • LeetCode算法系列_0891_子序列宽度之和
  • vue-cli在webpack的配置文件探究
  • win10下安装mysql5.7
  • 等保2.0 | 几维安全发布等保检测、等保加固专版 加速企业等保合规
  • 给第三方使用接口的 URL 签名实现
  • 精益 React 学习指南 (Lean React)- 1.5 React 与 DOM
  • 排序(1):冒泡排序
  • 前嗅ForeSpider中数据浏览界面介绍
  • 微信小程序实战练习(仿五洲到家微信版)
  • 我从编程教室毕业
  • 我与Jetbrains的这些年
  • 怎么将电脑中的声音录制成WAV格式
  • Nginx实现动静分离
  • 如何在招聘中考核.NET架构师
  • ​决定德拉瓦州地区版图的关键历史事件
  • #LLM入门|Prompt#1.7_文本拓展_Expanding
  • #基础#使用Jupyter进行Notebook的转换 .ipynb文件导出为.md文件
  • ( 10 )MySQL中的外键
  • (阿里巴巴 dubbo,有数据库,可执行 )dubbo zookeeper spring demo
  • (阿里云万网)-域名注册购买实名流程
  • (二十五)admin-boot项目之集成消息队列Rabbitmq
  • (附程序)AD采集中的10种经典软件滤波程序优缺点分析
  • (附源码)ssm基于微信小程序的疫苗管理系统 毕业设计 092354
  • (官网安装) 基于CentOS 7安装MangoDB和MangoDB Shell
  • (过滤器)Filter和(监听器)listener
  • (利用IDEA+Maven)定制属于自己的jar包
  • (转)项目管理杂谈-我所期望的新人
  • (转载)Google Chrome调试JS
  • ../depcomp: line 571: exec: g++: not found
  • .Net Framework 4.x 程序到底运行在哪个 CLR 版本之上
  • [AutoSar]BSW_OS 02 Autosar OS_STACK
  • [C++]类和对象(中)