一道DFS搜索题,更新的时候需要注意下
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<vector>
#define MAX 1010
using namespace std;
vector<int> gr[MAX],node[MAX];
int n,s,k,fa[MAX],ans;
bool vis[MAX];
void DFS(int u,int f,int deep)
{
fa[u]=f;
int num=gr[u].size();
if(num==1&&deep>k)
node[deep].push_back(u);
for(int i=0;i<num;i++)
{
int v=gr[u][i];
if(v!=f)
DFS(v,u,deep+1);
}
}
void DFSS(int u,int f,int deep)
{
vis[u]=1;
int num=gr[u].size();
for(int i=0;i<num;i++)
{
int v=gr[u][i];
if(v!=f&&deep<k)
DFSS(v,u,deep+1);
}
}
void Solve()
{
for(int i=n-1;i>k;i--)
{
for(int j=0;j<node[i].size();j++)
{
int u=node[i][j];
if(vis[u])
continue;
int v=u;
for(int l=0;l<k;l++)
v=fa[v];
DFSS(v,-1,0);
ans++;
}
}
}
int main()
{
int cas;
scanf("%d",&cas);
while(cas--)
{
ans=0;
memset(vis,0,sizeof(vis));
scanf("%d%d%d",&n,&s,&k);
for(int i=0;i<=n;i++)
{
gr[i].clear();
node[i].clear();
}
for(int i=0;i<n-1;i++)
{
int ita,itb;
scanf("%d%d",&ita,&itb);
gr[ita].push_back(itb);
gr[itb].push_back(ita);
}
DFS(s,-1,0);
Solve();
printf("%d\n",ans);
}
return 0;
}