A题dfs
牛牛打怪兽
https://ac.nowcoder.com/acm/contest/6631/A
因为边的问题,单看边是无法得到哪个是父哪个是子的
所以当成无向图来存取边,即邻接表
然后从根节点即1,开始dfs,即可
- 那么怎样保证不会重复dfs到父节点呢,可以用use数组将当前路径上遍历过的节点做标记
- 怎么判断叶子节点:上述用了use数组,那么当一个节点与他相邻的所有边的节点都已经被标记过了,即已经访问过了,那么说明他无路可dfs了,即他是叶子节点
注意几种测试用例
- 根节点有怪物
- 只有一个根节点
class Solution { vector<vector<int>> tree; vector<bool> use; int ans; public: int solve(int n, vector<Point>& Edge, vector<int>& f) { tree=vector<vector<int>>(n+1); for (Point &i:Edge) { tree.at(i.x).push_back(i.y); tree.at(i.y).push_back(i.x); } ans=0; use=vector<bool>(n+1,false); use.at(1)=true; dfs(1,f,2-f.at(0)); return ans; } void dfs(int cur,vector<int>& f,int life) { bool all_use=true; for (int i:tree.at(cur)) if (!use.at(i)) { all_use=false; if (life==0 && f.at(i-1)==1) continue; use.at(i)=true; dfs(i,f,life-f.at(i-1)); use.at(i)=false; } if (all_use) ++ans; } };