• 注意到不动点个数等价于数组的Mex,使用树上启发式合并(DSU on Tree) 统计每个子树的Mex累加即可。
///*****Sellaris*****///
#include <bits/stdc++.h>
#define ll long long
#define x first
#define y second

typedef unsigned long long ull;
typedef std::pair<int,int> pii;

using namespace std;

const int maxn=3e5+10;
const int mo=1e9+7;

inline int read(){
    int ret=0,f=1;char ch=getchar();
    while(!isdigit(ch)){if(ch=='-')f=-f;ch=getchar();}
    while(isdigit(ch)){ret=ret*10+ch-'0';ch=getchar();}
    return ret*f;
}

int a[maxn];

int n,m;
vector<int> v[maxn];
ll ans=0;
int mex[maxn];
set<int> s[maxn]; 
void dfs(int u,int fa){
	s[u].insert(u);
	mex[u]=1;
	for(int to:v[u]){
		if(fa==to){
			continue;
		}
		dfs(to,u);
		if(s[to].size()>s[u].size()){
			swap(s[to],s[u]);
		}
	}
	for(int to:v[u]){
		if(fa==to){
			continue;
		}
		for(auto x:s[to]){
			s[u].insert(x);
		}
		s[to].clear();
		mex[u]=max(mex[u],mex[to]);
	}
	while(s[u].find(mex[u])!=s[u].end()){
		mex[u]++;
	}
	ans+=1ll*(mex[u]-1);
}
inline void solve(){
	n=read();
	for(int i=1;i<=n-1;i++){
		int x=read(),y=read();
		v[x].push_back(y);
		v[y].push_back(x);
	}
	dfs(n,0);
	cout<<ans<<"\n";
}

signed main(){
	int t=1;
	for(int i=1;i<=t;i++){
		solve();
	}
    return 0;
}