Luogu P3174 [HAOI2009]毛毛虫 题解

Describe

题目链接

对于一棵树,我们可以将某条链和与该链相连的边抽出来,看上去就象成一个毛毛虫,点数越多,毛毛虫就越大。例如下图左边的树(图 $1$)抽出一部分就变成了右边的一个毛毛虫了(图 $2$)。

Solution

毛毛虫?

很明显,我们可以先预处理出每个点的入度。

显然最后的答案就是$\sum{a_i}-(s-1)+1=\sum{a_i-1}+2$(好好想想)

Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include<bits/stdc++.h>
using namespace std;
int n,m,in[300010],Max,now;
vector<int> v[300010];
inline void DFS(int x,int fa,int sum){
if(sum>Max){
Max=sum;
now=x;
}
for(auto i:v[x])
if(fa!=i) DFS(i,x,sum+in[i]);
}
int main(){
scanf("%d%d",&n,&m);
for(int x,y,i=1;i<=m;i++){
scanf("%d%d",&x,&y);
v[x].push_back(y);
v[y].push_back(x);
in[x]++;in[y]++;
}
for(int i=1;i<=n;i++) in[i]--;
DFS(1,0,in[1]);
Max=0;
DFS(now,0,in[now]);
printf("%d\n",Max+2);
}