• PAT:1053. Path of Equal Weight (30) AC


    #include<stdio.h>
    #include<vector>
    #include<queue>
    #include<algorithm>
    using namespace std;
    const int MAX=1010;
    
    int n,m;        //n个节点,m个非叶子节点 
    long long int S;    //待测权值
    
    long long int weight[MAX];  //每个节点的权值
    
    vector<int> child[MAX];    //存储节点
    
    bool cmp(int a,int b)
    {
      return weight[a]>weight[b];
    }
    
    long long int sum=0;
    vector<int> path;  //存路径权值
    void DFS(int root)
    {
      if(child[root].size()==0)
      {
        if(sum==S)
        {
          printf("%d",path.front());    //权值S不为0,符合条件一定有路径。单独输出首个,控制后面空格数
          for(int i=1 ; i<path.size() ; ++i)
            printf(" %d",path[i]);    //输出剩余路径
          printf("
    ");
        }
        return;
      }
      for(int i=0 ; i<child[root].size() ; ++i)
      {
        sum+=weight[child[root][i]];    //加上该孩子的权值
        //printf("root=%d, i=%d, sum=%lld, child[root][i]=%d
    ", root, i, sum, child[root][i]);
        path.push_back(weight[child[root][i]]);    //该孩子加入到路径
        DFS(child[root][i]);
        sum-=path[path.size()-1];
        path.pop_back();
      }
    }
    int main()
    {
      scanf("%d%d%lld",&n,&m,&S);
      for(int i=0 ; i<n ; ++i)
        scanf("%lld",&weight[i]);
      for(int i=0 ; i<m ; ++i)
      {
        int father,k,c;
        scanf("%d%d",&father,&k);
        for(int j=0 ; j<k ; ++j)
        {
          scanf("%d",&c);
          child[father].push_back(c);
        }
        sort(child[father].begin(),child[father].end(),cmp);    //【skill】对vector进行排序,保证遍历的时候从大到小
      }
      path.push_back(weight[0]);
      sum+=weight[0];
      DFS(0);
      return 0;
    }
  • 相关阅读:
    年轻人如何去有效的学习(很好的鸡汤,一语惊醒梦中人)
    python基础07 函数
    python基础06 循环
    python基础05 缩进与选择
    python基础04 运算
    python基础03 序列
    python基础02 基本数据类型
    python基础01 Hello World
    CSS3(三)BFC、定位、浮动、7种垂直居中方法
    CSS3(二)Box Model、边距折叠、内联与块标签、CSSReset
  • 原文地址:https://www.cnblogs.com/Evence/p/4321869.html
Copyright © 2020-2023  润新知