A题dfs

牛牛打怪兽

https://ac.nowcoder.com/acm/contest/6631/A

因为边的问题,单看边是无法得到哪个是父哪个是子的
所以当成无向图来存取边,即邻接表
然后从根节点即1,开始dfs,即可

  1. 那么怎样保证不会重复dfs到父节点呢,可以用use数组将当前路径上遍历过的节点做标记
  2. 怎么判断叶子节点:上述用了use数组,那么当一个节点与他相邻的所有边的节点都已经被标记过了,即已经访问过了,那么说明他无路可dfs了,即他是叶子节点

注意几种测试用例

  1. 根节点有怪物
  2. 只有一个根节点
    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;
     }
    };
全部评论

相关推荐

牛客101244697号:这个衣服和发型不去投偶像练习生?
点赞 评论 收藏
分享
10-13 17:47
门头沟学院 Java
wulala.god:图一那个善我面过,老板网上找的题库面的
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务