- 來源:F.Folder - Codeforces
- 題意:給定由\(n(1\le n\le 10^5)\)個結點組成的樹,每次操作可將一棵子樹接到其他結點上。求將樹轉換為一棵斜樹的最小操作次數。
- 關鍵詞:思維(簽到)
- 題解:斜樹中所有結點僅位于一側子樹,其僅有一個葉子節點。注意到根節點到葉子節點有且僅存在一條路徑,因此每個葉子節點只需移動一次即可變為非葉子節點,最后僅保留一個葉子節點即可。故答案為葉子節點數-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;
}