[BZOJ] 1040: [ZJOI2008]骑士
最初想成了缩点了,感觉一个强连通分量只能选出一个人,gg...
正解基环树dp,把环断开后强制两个断点分别不选进行dp即可。
今天电脑抽风,老吞代码..
#include<iostream> #include<cstring> #include<cstdio> #define int long long using namespace std;inline int rd() {int ret=0,f=1;char c;while(c=getchar(),!isdigit(c))f=c=='-'?-1:1;while(isdigit(c))ret=ret*10+c-'0',c=getchar();return ret*f; }const int MAXN=1000050;int val[MAXN],wei[MAXN];struct Edge {int from,next,to;Edge(int x=0,int y=0,int w=0) {from=x;next=y;to=w;} } e[MAXN<<1]; int ecnt=1,head[MAXN]; inline void add(int x,int y){e[++ecnt]=Edge(x,head[x],y);head[x]=ecnt; }bool vis[MAXN];int n; int f[MAXN][2]; int cx,cy,ci; void dfs(int x,int pre){f[x][1]=val[x];f[x][0]=0;for(int i=head[x];i;i=e[i].next){int v=e[i].to;if(v==pre||i==ci||(i==(ci^1))) continue;dfs(v,x);f[x][1]+=f[v][0];f[x][0]+=max(f[v][0],f[v][1]);} }void findCircle(int x,int pre){vis[x]=1;for(int i=head[x];i;i=e[i].next){int v=e[i].to;if(v==pre) continue;if(vis[v]) {cx=x,cy=v,ci=i;continue;}findCircle(v,x);} }int ans;signed main(){n=rd();int x,y,w;for(int i=1;i<=n;i++){val[i]=rd();x=rd();add(x,i);add(i,x);}int ans1=0,ans2=0;for(int i=1;i<=n;i++){if(vis[i]) continue;findCircle(i,0);dfs(cx,0);ans1=f[cx][0];dfs(cy,0);ans2=f[cy][0];ans+=max(ans1,ans2);}cout<<ans; }
转载于:https://www.cnblogs.com/ghostcai/p/9400411.html
[BZOJ] 1040: [ZJOI2008]骑士相关推荐
- bzoj 1040: [ZJOI2008]骑士 树形dp
题目链接 1040: [ZJOI2008]骑士 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 3054 Solved: 1162 [Submit] ...
- 基环树DP(bzoj 1040: [ZJOI2008]骑士)
树:n个点n-1条边的连通图 基环树:n个点n条边的连通图,也就是一个环套着多棵树 基环树DP:找到环上任意相邻两点,断掉这两点之间的边,就形成了一棵树 之后对这两点分别进行一次树形DP即可 例题: ...
- bzoj 1040: [ZJOI2008]骑士
第一次做环套树的题 这道题题目中貌似是有向边,实际上想一想就知道是无向的. 因为一个骑士觉得另一个骑士丑他们俩就走不到一起. 所以整个图实际上是一个无向环套树森林. 对于每一棵环套树,先dfs找环,找 ...
- BZOJ 1040 ZJOI2008 骑士 树形DP
题目大意:给定一个基环树林,每一个点上有权值,要求选择一个权值和最大的点集,要求点集中的随意两个点之间不能直接相连 最大点独立集--考虑到n<=100W,网络流铁定跑不了,于是我们考虑树形DP ...
- BZOJ 1040 [ZJOI2008]骑士
内向树dp~ 就是先找环,任取环上有边相连两点,u和v,以u为根,断开u和v之间的边,做两次树形dp,dp[i][0]表示i不选,dp[i][1]表示i选 ①强制u不选,v随意 ②u随意,v不选 两种 ...
- bzoj 1040 1040: [ZJOI2008]骑士
1040: [ZJOI2008]骑士 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 5210 Solved: 1987 [Submit][Stat ...
- 1040: [ZJOI2008]骑士
Time Limit: 10 Sec Memory Limit: 162 MB Submit: 7113 Solved: 2797 [Submit][Status][Discuss] Descri ...
- BZOJ1040: [ZJOI2008]骑士
1040: [ZJOI2008]骑士 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 5332 Solved: 2023 [Submit][Stat ...
- P2607 [ZJOI2008]骑士
P2607 [ZJOI2008]骑士 题意: n个点n个边,每个点都有权值,相邻的点不能同时选择,问如何选择能使得权值最大 题解: 这个题很有P1352 没有上司的舞会这个题的感觉,唯一的区别是那个题 ...
- bzoj 1038 [ZJOI2008]瞭望塔
1038: [ZJOI2008]瞭望塔 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 2438 Solved: 1004 [Submit][Sta ...
最新文章
- 泼点冷水,P2P借款限额是不是想的太美好?
- JAVA微信APP支付接口整合
- mysqlcppconn之ConnectOptionsMap的使用
- asp.net 调用带证书的webservice解决办法
- 3D数学基础:图形与游戏开发---随笔二
- PHP多线程的实现(PHP多线程类)
- C++中operator的两种用法
- jQuery中的函数汇总1
- linux下进程的创建代码,伪代码说明Linux进程创建过程
- 以rpm包形式升级Linux驱动
- 如何看Spring源码
- 智慧城市顶层设计规划方案
- QT QLabel中字体行间距怎么设置?
- 为你的企业建立竞争情报系统
- nodejs ffi调用C++dll动态库 ffi调用语法
- 每日一题:给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
- python换脸开源_Python实现AI换脸功能
- es6 filter() 数组过滤方法总结
- 十年HRD总结3个逆向思维的招聘方法
- HINSTANCE初了解