题意:Kefa想去餐厅,要穿过公园。公园由一棵树组成,有n个节点,叶子节点上是餐厅,每节点上可能有猫,Kefa害怕猫,当有连续m只猫出现时,就不能继续往下走了。我们需要找出Kefa能去多少家餐厅。
题解:dfs深搜,设置跳出条件:连续猫得数量超过m;或者已经走到了叶子节点(度为0的节点)。搜索所在点连接的各个点。
accode:
vector<int>G[100010];//用来存图 int iscat[100010];//存储是否该点有猫 int isleaf[100010];//用于判断是否是叶子节点 int vis[100010];//判断该点是否走过 int n, m,ans=0;
void dfs(int sta, int cat)
{
if (iscat[sta])cat++;//记录连续的猫
else cat = 0;
if (cat > m)return;//如果不满足条件就跳出
if (isleaf[sta] < 2 && sta != 1)
{
ans++;
return;
}//满足条件记录答案
if (vis[sta] == 0)// 遍历
{
vis[sta] = 1;
for (int i = 0; i < G[sta].size(); i++)
dfs(G[sta][i], cat);
vis[sta] = 0;
}
}
int main() { cin >> n >> m; for (int i = 1; i <= n; i++) cin >> iscat[i]; for (int i = 1; i <= n - 1; i++) { int x, y; cin >> x >> y; G[x].push_back(y); G[y].push_back(x); isleaf[x]++; isleaf[y]++;//无向图,双方标记 } dfs(1, 0); cout << ans; return 0; }