题解:P12747 [POI 2016 R3] 巡游 Parade
一道树状 DP。
题意
在树上找一条路径,使得路径上的每一个点连接的非路径边的数量最大。
转化一下,设一个点
思路
在把树的根设为
想象一下,设当前考虑的点为
我们定义
那么最终答案就很好求了。在找以点
最后给找到的所有答案取最大值就行了。
代码
#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5+5;
long long n,d[maxn],ans;
vector<int> a[maxn];
void dfs(int u,int fa)
{
long long max1=-1e9,max2=-1e9,s=a[u].size();
//注意由于vector的size是unsigned long long类型的,要先转化成long long
d[u]=a[u].size();
for(int v:a[u])
if(v!=fa)
{
dfs(v,u);
d[u]=max(d[u],d[v]+s-2);
if(d[v]-2>=max1)
{
max2=max1;
max1=d[v]-2;
}
else if(d[v]-2>max2)max2=d[v]-2;
}
ans=max(ans,s+max1);
ans=max(ans,s+max1+max2);
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n;
for(int i=1;i<n;i++)
{
int u,v;
cin>>u>>v;
a[u].push_back(v);
a[v].push_back(u);
}
dfs(1,0);
cout<<ans;
}
/*
!(^w^)?
*/