题目地址: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;
}
}