提交时间:2024-11-06 08:31:34

运行 ID: 34334

#include<bits/stdc++.h> #define up(i,l,r) for(int i=(l);i<=(r);++i) #define down(i,l,r) for(int i=(l);i>=(r);--i) #define pi pair<int,int> #define p1 first #define p2 second #define p_b push_back #define m_p make_pair typedef long long ll; using namespace std; const int maxn=2e5+10; inline ll read(){ ll x=0;short t=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')t=-1;ch=getchar();} while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar(); return x*t; } int n,siz[maxn],dep[maxn],f[maxn],tg[maxn],res,t[maxn]; vector<int>v[maxn]; void dfs(int u,int fa){ siz[u]=1,f[u]=fa; for(int x:v[u])if(x!=fa)dep[x]=dep[u]+1,dfs(x,u),siz[u]+=siz[x]; } void dfs2(int u,int fa,int sz){ //cout<<"dfs "<<u<<" "<<siz[u]<<" "<<sz<<endl; res++,tg[u]=1; for(int x:v[u])if(siz[u]>sz&&(!tg[x])&&x!=fa)dfs2(x,u,sz),siz[u]-=siz[x]; } bool cmp(int x,int y){ return siz[x]>siz[y]; } void slv(){ n=read(); up(i,1,n-1){ int x=read(),y=read(); v[x].p_b(y),v[y].p_b(x); }dfs(1,0); up(i,1,n){ sort(v[i].begin(),v[i].end(),cmp); }if((n&1)^(dep[n]&1)){printf("-1");return;} int p=n;t[n]=siz[n];p=f[p];int lst=n;while(p)t[p]=siz[p]-siz[lst],lst=p,p=f[p]; p=n;while(p)siz[p]=t[p],p=f[p]; p=n;while(p)dfs2(p,f[p],(n-dep[n])/2+dep[p]),p=f[p]; cout<<res; } int main(){ //freopen("1.in","r",stdin),freopen("1.out","w",stdout); slv(); return 0; }