题目描述
图中有 N N N个点,每两点间只有唯一的路径,对于这样一个给定的图,最大的“毛毛虫”会有多大。毛毛虫包含一条主链,毛毛虫中的节点,要不在主链上,要么和主链上某节点相邻,点数越多,毛毛虫越大。
题目解析
从题目中每两点间只有唯一的路径可以得出这是一颗树。
我们可以先将每个点转化为一个带权的点,权为该点的度数,然后就和在一棵树上求最长链一样了。
代码
#include<bits/stdc++.h>
#define N 1000005
using namespace std;
int n,m,ans,pos;
int a[N];
bool vis[N];
int cnt=0,ls[N];
struct A
{
int v,next;
}e[2*N];
void add(int x,int y) {e[++cnt].v=y;e[cnt].next=ls[x];ls[x]=cnt;}
void dfs(int x,int t,int lev)
{
vis[x]=1;
for(int i=ls[x];i;i=e[i].next)
if(!vis[e[i].v])
{
vis[e[i].v]=1;
if(lev==1) dfs(e[i].v,t+a[e[i].v],0);
else dfs(e[i].v,t+a[e[i].v]-1,0);
}
if(t>ans) ans=t,pos=x;
}
int main()
{
cin>>n>>m;
for(int i=1,x,y;i<=m;i++)
cin>>x>>y,a[x]++,a[y]++,add(x,y),add(y,x);
dfs(1,1,1);
memset(vis,0,sizeof(vis));
ans=0;
dfs(pos,1,1);
cout<<ans;
}