- 来源:F.Folder - Codeforces
- 题意:给定由 n ( 1 ≤ n ≤ 1 0 5 ) n(1\le n\le 10^5) n(1≤n≤105)个结点组成的树,每次操作可将一棵子树接到其他结点上。求将树转换为一棵斜树的最小操作次数。
- 关键词:思维(签到)
- 题解:斜树中所有结点仅位于一侧子树,其仅有一个叶子节点。注意到根节点到叶子节点有且仅存在一条路径,因此每个叶子节点只需移动一次即可变为非叶子节点,最后仅保留一个叶子节点即可。故答案为叶子节点数-1。
- 代码:
#include<bits/stdc++.h>using namespace std;
using ll=long long;
#define int ll
#define endl "\n"void solve(){int n;cin>>n;vector<bool>leaf(n+1,1);for(int i=1;i<n;i++){int _;cin>>_;leaf[_]=0;}int cnt=0;for(int i=1;i<=n;i++){if(leaf[i]) cnt++;}cout<<cnt-1<<endl;
}
signed main(){ios::sync_with_stdio(0),cin.tie(0);int t=1;while(t--) solve();return 0;
}