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

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

对于一个联通块内,有且只有一个环,即n个点n条边

那么找到那个环,然后任意断一条边,这个联通块就变成一棵树了,然后做树形DP就行了

对于断的边要记录下来DP时特判

Code

 

#include 
#include
#include
#define ll long long#define N 1000010using namespace std;struct info{int to,nex;}e[N*2];int n,A[N],tot=1,head[N],x,y,ee;ll Ans,dp[N][2];bool vis[N];void Link(int u,int v){ e[++tot].nex=head[u];head[u]=tot;e[tot].to=v;}inline int read(){ int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f;}bool Fvis[N];void Find(int u,int fa){ Fvis[u]=1; for(int i=head[u],v;i;i=e[i].nex){ if((v=e[i].to)==fa) continue; if(Fvis[v]) x=u,y=v,ee=i; else Find(v,u); }}void DP(int u,int fa){ vis[u]=1; dp[u][0]=0,dp[u][1]=A[u]; for(int i=head[u],v;i;i=e[i].nex){ if((v=e[i].to)!=fa&&i!=ee&&(i^1)!=ee){ DP(v,u); dp[u][1]+=dp[v][0]; dp[u][0]+=max(dp[v][0],dp[v][1]); } }}void solve(int u){ if(vis[u]) return; vis[u]=1; memset(Fvis,0,sizeof(Fvis)); Find(u,0); DP(x,0); ll t=dp[x][0]; DP(y,0); Ans+=max(t,dp[y][0]);}int main(){ n=read(); for(int i=1,x;i<=n;++i) A[i]=read(),Link(x=read(),i),Link(i,x); for(int i=1;i<=n;solve(i++)); printf("%lld\n",Ans); return 0;}

 

转载于:https://www.cnblogs.com/void-f/p/9130135.html

你可能感兴趣的文章
javascript面向对象——构造函数和原型对象
查看>>
route 的标志位
查看>>
[转载]对于WebGrid第三方控件的使用
查看>>
[摘录]高效人士七习惯—以终为始原则
查看>>
angular 当使用ng-repeat 时出现 $$hashKey的键值对
查看>>
GoldenGate 性能优化方法
查看>>
正则表达式和re模块
查看>>
[区块链]Merkle Tree
查看>>
Token 认证
查看>>
搜索服务solr 一二事(1) - solr-5.5 使用自带Jetty或者tomcat 搭建单机版搜索服务器...
查看>>
Html5新增加的属性
查看>>
php生成图片缩略图,支持png透明
查看>>
Django——模板层(template)(模板语法、自定义模板过滤器及标签、模板继承)
查看>>
论一个蒟蒻的脑子里可以有多少坑(貌似咕了……目前更新保持在noip阶段)
查看>>
Python第三方库安装和卸载zz
查看>>
C++——虚函数表解析
查看>>
重磅!共享单车漏洞独家发布。
查看>>
html中特殊符号
查看>>
为什么 SharedPreferences 可以直接 调用,前面却没有对象
查看>>
php fsockopen 中多线程的解决办法
查看>>