#include<cstdio> #include<algorithm> const int MAXN=100000+5; struct Edge{int next,target;}; struct Data{int id,val;}; int head[MAXN],cnt,fa[MAXN],min,max,n,vis[MAXN][3],scnt;Edge edge[MAXN];Data data[MAXN]; bool comp(Data a,Data b){return a.val<b.val;} void AddEdge(int u,int v) { Edge e; e.next=head[u];e.target=v;head[u]=++cnt; edge[cnt]=e; } void Search(int now) { if(vis[now][0]) { min=std::min(vis[now][0],min); max=std::max(vis[now][1],max); scnt+=vis[now][2]; return; } scnt++; for(int i=head[now];i;i=edge[i].next) { Search(edge[i].target); } } int main() { int x,y; scanf("%d",&n); for(int i=1;i<=n;i++) data[i].id=i; for(int i=1;i<n;i++) { scanf("%d %d",&x,&y); AddEdge(x,y); data[x].val++; } int ans=0,ii; std::sort(data+1,data+n+1,comp); for(int i=1;i<=n;i++) { ii=data[i].id; min=max=ii; scnt=0; Search(ii); vis[ii][0]=min; vis[ii][1]=max; vis[ii][2]=scnt;; if(scnt==max-min+1) ans++; } printf("%d",ans); return 0; }
|