dfs1求出每个节点的子树大小和最大的儿子子树,dfs2统计个数,每次不统计最大儿子子树,flag确保只会减掉一颗子树
#include<bits/stdc++.h>
#define maxn 310
using namespace std;
inline void read(int &x)
{
int y=1;
x=0;
char ch=getchar();
while(ch<'0'||ch>'9')
{
if(ch=='-')y=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
x=x*10+ch-'0';
ch=getchar();
}
x=x*y;
}
int n,p;
vector<int> g[maxn];
inline void add(int u,int v)
{
g[u].push_back(v);
g[v].push_back(u);
}
int dp[maxn],son[maxn];
void dfs1(int u,int fa)
{
dp[u]=1;
int maxson=0;
for(int i=0;i<g[u].size() ;i++)
{
int v=g[u][i];
if(v==fa)continue;
dfs1(v,u);
maxson=max(maxson,dp[v]);
dp[u]+=dp[v];
}
son[u]=maxson;
}
int ans;
void dfs2(int u,int fa)
{
bool flag=true;
for(int i=0;i<g[u].size() ;i++)
{
int v=g[u][i];
if(v==fa)continue;
if(dp[v]==son[u]&&flag)
{
flag=false;
continue;
}
dfs2(v,u);
}
ans-=son[u];
}
int main(){
read(n);read(p);
int u,v;
for(int i=1;i<=p;i++)
{
read(u);read(v);
add(u,v);
}
dfs1(1,0);
ans=n;
dfs2(1,0);
printf("%d\n",ans);
return 0;
}