2013杭电warm up1 1002 Pet 求树结点的高度
题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=4707
题目给出一颗树,要求求出深度大于D的结点的个数。
有两种方法,改写dfs,给一个参数放层数(额,其实这里不需要转化为有根树,多于了)
代码:
#include<iostream> #include<vector> #include<cstdio> #include<cstring> using namespace std; #define maxn 100005 vector<int> G[maxn]; int p[maxn]; int lev[maxn]; //vector<int> leaf; void dfs(int u,int fa,int level) // 无根树转化为有根树 { int d=G[u].size(); // if(d==1&&u!=0) leaf.push_back(u); 可行的改造 求出所有叶子结点 lev[u]=level; for(int i=0;i<d;i++) { int v=G[u][i]; if(v!=fa)dfs(v,p[v]=u,level+1); } } void init() { for(int i=0;i<maxn;i++) G[i].clear(); // leaf.clear(); memset(p,0,sizeof(p)); memset(lev,0,sizeof(lev)); } int main() { int T; cin>>T; int n,m; int a,b; int D; while(T--) { init(); scanf("%d%d",&n,&D); for(int i=0;i<n-1;i++) { scanf("%d%d",&a,&b); G[a].push_back(b); G[b].push_back(a); } p[0]=-1; dfs(0,-1,0); int count=0; for(int i=0;i<n;i++) if(lev[i]>D) count++; cout<<count<<endl; } }
然后就是bfs方法
#include<iostream> #include<vector> #include<cstdio> #include<cstring> #include<queue> using namespace std; #define maxn 100005 vector<int> G[maxn]; bool vis[maxn]; int lev[maxn]; //vector<int> leaf; queue<int> q; void bfs(int u) { q.push(u); while(q.empty()==false) { int k=q.front(); vis[k]=1; q.pop(); int size=G[k].size(); for(int i=0;i<size;i++) { int v=G[k][i]; if(!vis[v]) { q.push(v); lev[v]=lev[k]+1; } } } } void init() { for(int i=0;i<maxn;i++) G[i].clear(); // leaf.clear() memset(vis,0,sizeof(vis)); memset(lev,0,sizeof(lev)); } int main() { int T; cin>>T; int n,m; int a,b; int D; while(T--) { init(); scanf("%d%d",&n,&D); for(int i=0;i<n-1;i++) { scanf("%d%d",&a,&b); G[a].push_back(b); G[b].push_back(a); } bfs(0); int count=0; for(int i=0;i<n;i++) if(lev[i]>D) count++; cout<<count<<endl; } }