https://ac.nowcoder.com/acm/contest/7817/C
アイデア:シミュレートするデータをいくつか作成して、最小回数がリーフノードの数-1であることを確認する方が明白です。しかし、これで十分ですか?waは、ノード次数が1の場所からdfsを開始する必要があることを発見しました。データを作成し、中間点を中央のルートとして使用すると、より多くのリーフノードが発生することがわかりました。
リーフノードの1つをルートとして作成し、リーフの数が最小になるようにします。
#include<iostream>
#include<vector>
#include<queue>
#include<cstring>
#include<cmath>
#include<map>
#include<set>
#include<cstdio>
#include<algorithm>
#define debug(a) cout<<#a<<"="<<a<<endl;
using namespace std;
const int maxn=3e5+100;
typedef long long LL;
vector<LL>g[maxn];
LL deg[maxn];
bool vis[maxn];
LL sum=0;
void dfs(LL u,LL fa)
{
for(LL i=0;i<g[u].size();i++)
{
LL v=g[u][i];
if(!vis[v]&&v!=fa)
{
vis[v]=true;
if(deg[v]==1) sum++;
dfs(v,u);
}
}
}
int main(void)
{
cin.tie(0);std::ios::sync_with_stdio(false);
LL n;cin>>n;
if(n==1){
cout<<0<<endl;return 0;
}
for(int i=1;i<n;i++){
LL x,y;cin>>x>>y;
g[x].push_back(y);g[y].push_back(x);
deg[x]++;deg[y]++;
}
///vis[1]=true;
///dfs(1,-1);
for(LL i=1;i<=n;i++){
if(deg[i]==1){
vis[i]=true;
dfs(i,-1);
cout<<sum-1<<endl;
return 0;
}
}
/// cout<<sum-1<<endl;
return 0;
}