标签:sign -- std mem solution 答案 最长路 main +=
在一棵树中,一条链及与它直接相连的所有边的集合称作一个毛毛虫,这个子图中的点数称作这个毛毛虫的大小。求一棵树中最大的毛毛虫。\(N\leq 3\times10^5\)
设每个点的权值为 \(deg_i-1\),然后求最长路即可,答案就是 \(ans+2\)
#include <bits/stdc++.h>
using namespace std;
const int N = 300005;
vector <int> g[N];
int n,m,vis[N],a[N],f[N],ans;
void dfs(int p) {
vis[p]=1;
f[p]+=a[p];
for(int q:g[p]) {
if(vis[q]) continue;
f[q]=f[p];
dfs(q);
}
}
signed main() {
ios::sync_with_stdio(false);
cin>>n>>m;
for(int i=1;i<=m;i++) {
int u,v;
cin>>u>>v;
g[u].push_back(v);
g[v].push_back(u);
a[u]++;
a[v]++;
}
for(int i=1;i<=n;i++) a[i]--;
dfs(1);
int mx=0;
for(int i=1;i<=n;i++) if(f[mx]<f[i]) mx=i;
memset(vis,0,sizeof vis);
memset(f,0,sizeof f);
dfs(mx);
int my=0;
for(int i=1;i<=n;i++) if(f[my]<f[i]) my=i;
cout<<f[my]+2<<endl;
}
标签:sign -- std mem solution 答案 最长路 main +=
原文地址:https://www.cnblogs.com/mollnn/p/12395191.html