题解:

首先从基环树上的环上选两个点x,y

断开x,y之间的边,然后做树形DP.

设f[x]为选x的情况下的最大值,g[x]为不选x的情况下的最大值.

分两种情况讨论,

1.选x,则y一开始就处于被支配状态,在计算y的f[]函数值时需要特判.

2.不选x,按正常DP做即可.

 #include<cstdio>
#include<vector>
using namespace std;
#define ll long long
#define FILE "dealing"
#define up(i,j,n) for(int i=j;i<=n;i++)
#define db long double
#define pii pair<int,int>
#define pb push_back
#define mem(a,L) memset(a,0,sizeof(int)*(L+1))
template<class T> inline bool cmin(T& a,T b){return a>b?a=b,true:false;}
template<class T> inline bool cmax(T& a,T b){return a<b?a=b,true:false;}
template<class T> inline T squ(T a){return a*a;}
const ll maxn=+,inf=1e9+,limit=1e7;
int read(){
int x=,f=,ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<='')x=(x<<)+(x<<)+ch-'',ch=getchar();
return x*f;
}
int n;
vector<int> t[maxn];
int f[maxn],g[maxn],to[maxn];
int vis[maxn];
int rt,rt2,q[maxn],top=;
void dfs(int x){
q[++top]=x;
vis[x]=;
if(!vis[to[x]])dfs(to[x]);
else {
rt=x;
rt2=to[x];
}
}
void dfs2(int x){
vis[x]=;
for(int i=;i<t[x].size();i++)
if(!vis[t[x][i]])dfs2(t[x][i]);
if(!vis[to[x]])dfs2(to[x]);
}
//f[x] 选 g[x] 不选
int flag=;
void dfs1(int x){//选rt
f[x]=,g[x]=;int Max=-inf;
for(int i=;i<t[x].size();i++){
int y=t[x][i];if((x==rt2&&y==rt))continue;
dfs1(y);
f[x]+=f[y];
g[x]+=f[y];
cmax(Max,g[y]-f[y]);
}
f[x]+=Max;
if(x==rt2&&flag)f[x]-=Max;
cmax(f[x],);
} int main(){
freopen(FILE".in","r",stdin);
freopen(FILE".out","w",stdout);
n=read();
up(i,,n){
to[i]=read();
t[to[i]].push_back(i);
}
int ans=;
up(i,,n){
if(vis[i])continue;
top=;dfs(i);
while(top)vis[q[top--]]=;
dfs2(i);
int Ans=;
flag=;
dfs1(rt);
cmax(Ans,g[rt]);
flag=;
dfs1(rt);
cmax(Ans,f[rt]);
ans+=Ans;
}
printf("%d\n",ans);
return ;
}

最新文章

  1. iframe关于滚动条的去除和保留
  2. 10 Symbol
  3. echarts之tooltip
  4. 【转载】 删除Win10“这台电脑”中的6个文件夹
  5. RK 61 键盘 Ubuntu 下键位映射修改方案
  6. 【zTree】 zTree使用的 小例子
  7. WCF Data Service 使用小结(二) —— 使用WCF Data Service 创建OData服务
  8. 开源App之MyHearts(二)
  9. Python通过Manager方式实现多个无关联进程共享数据
  10. MSP430F5438点亮led
  11. 客户Oracle数据库在插入数据的时候报超出最大长度的错误(规避风险)
  12. iOS 开发者证书总结
  13. ABP入门系列(7)——分页实现
  14. Lesser known dplyr tricks
  15. hello 内核模块
  16. IAR Embedded Workbench for ARM 8.22.1 基础使用教程
  17. Android 自定义TextView 实现文本间距
  18. query compiler
  19. 本地git仓库常用操作
  20. NO.8:自学python之路------并行socket网络编程

热门文章

  1. 研读:Shielding applications from an untrusted cloud with Haven
  2. linux中判断符号[]注意事项
  3. Spket安装
  4. 【Web API系列教程】3.10 — 实战:处理数据(公布App到Azure App Service)
  5. HDU BestCoder Round #1 1002 项目管理
  6. HTML5 2D平台游戏开发#1
  7. SpringMvc自动代理
  8. 宜信开源|微服务任务调度平台SIA-TASK入手实践
  9. php nginx超时出错
  10. CentOS6下基于Nginx搭建mp4/flv流媒体服务器