题目理解:这是一道DFS题,只不过是加多了两个条件,一:选取的值为树的叶子数,二:不能选取有猫的叶子,以及一条路上只能连续走过不超过M个带有猫的结点。好了上代码。
方法一:
#include<bits/stdc++.h>
using namespace std;
const int maxn = 10000000;
int vis[maxn];
int num[maxn];
int n,m,a,b;
int cnt = 0;
vector<int>vec[maxn];
void dfs(int k,int sum)
{
vis[k] = 1;
if(sum > m) return ;
int flag = 0;
for(int i = 0 ; i < vec[k].size() ; i ++ )
{
int v = vec[k][i];
if(vis[v] == 0)
{
flag = 1;
if(num[v] == 0)
{
dfs(v,0);
}
else
{
dfs(v,sum + 1);
}
}
}
if(!flag)
cnt ++ ;
}
int main()
{
cin >> n >> m;
memset(vis,0,sizeof(vis));
memset(num,0,sizeof(num));
for(int i = 1 ; i <= n ; i ++ )
cin >> num[i];
for(int i = 1 ; i < n ; i ++ )
{
cin >> a >> b;
vec[a].push_back(b);
vec[b].push_back(a);
}
dfs(1,num[1]);
cout << cnt << endl;
return 0;
}
注释:感谢我的队友(这是我队友的方法!!!!)有看不懂得地方可以评论,我每天都上csdn。
方法二:
#include<bits/stdc++.h>
using namespace std;
const int inf = 1000000;
int num[inf];
int vis[inf];
vector<int>vec[inf];
int n,m,ai = 0,sum = 0;
void dfs(int k,int minx)
{
vis[k] = 1;
for(int i = 0 ; i < vec[k].size() ; i ++ )
{
int v = vec[k][i];
if(!vis[v]){
if(num[v] == 0)
{
if(vec[v].size() == 1)
sum ++ ;
dfs(v,0);
}
else if(minx + 1 <= m)
{
if(vec[v].size() == 1)
sum ++ ;
dfs(v,minx + 1);
}
}
}
}
int main()
{
int a,b;
cin >> n >> m;
memset(vis,0,sizeof(vis));
memset(num,0,sizeof(num));
for(int i = 1 ; i <= n ; i ++ )
{
cin >> num[i];
}
for(int i = 1 ; i < n ; i ++ )
{
cin >> a >> b;
vec[a].push_back(b);
vec[b].push_back(a);
}
dfs(1,num[1]);
cout << sum << endl;
return 0;
}
这是我自己的代码,虽然是简单的DFS,但是弄递归条件还是弄了很久,还是太弱了,如果有更好的方法希望大佬指教,我每天都上CSDN.