Description
Input
Output
Sample Input
4
2 3
2 1
2 4
Sample Output
4
Data Constraint
Solution
简单题,一遍 dfs 求出每棵子树中最小顶点编号,最大顶点编号以及子树大小即可判断该子 树是否满足要求。可我考场就是没有想出来!
Code
#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 100010
using namespace std;
int n,x,y,s,t[N],nx[N],l[N],d[N],mi[N],ma[N],sz[N],ans=0;
void add(int x,int y){
d[y]++;
t[++t[0]]=y;
nx[t[0]]=l[x];
l[x]=t[0];
}
void dg(int x,int y){
mi[x]=ma[x]=x;sz[x]=1;int v;
for(int k=l[x];k;k=nx[k]){
if((v=t[k])!=y){
dg(v,x);
sz[x]+=sz[v];
mi[x]=min(mi[x],mi[v]);
ma[x]=max(ma[v],ma[x]);
}
}
if(sz[x]==(ma[x]-mi[x]+1)) ans++;
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n-1;i++){scanf("%d%d",&x,&y);add(x,y);}
for(int i=1;i<=n;i++){
if(!d[i]){
dg(i,0);
break;
}
}
printf("%d",ans);
return 0;
}
作者:zsjzliziyang
QQ:1634151125
转载及修改请注明
本文地址:https://blog.csdn.net/zsjzliziyang/article/details/84887499