题解给出的是带log的,,我自己写了个on的。。
#include<bits/stdc++.h> #include<vector> using namespace std; #define maxn 200005 vector<int>G[maxn]; int d[maxn],ans,n,flag[maxn]; void dfs(int u,int pre,int dep){ d[u]=dep; for(int i=0;i<G[u].size();i++){ int v=G[u][i]; if(v==pre)continue; dfs(v,u,dep+1); } } //三类结点:0没被访问过的,1:被连边的,2:距离<=2的 void dfs2(int u,int pre){ for(int i=0;i<G[u].size();i++){ int v=G[u][i]; if(v==pre)continue; dfs2(v,u); } if(flag[u]==0 && d[u]>2)flag[pre]=1; if(flag[u]==1){ ans++; if(flag[pre]!=1)flag[pre]=2; } } int main(){ cin>>n; for(int i=1;i<n;i++){ int u,v; cin>>u>>v; G[u].push_back(v); G[v].push_back(u); } dfs(1,1,0);dfs2(1,1); cout<<ans<<endl; }