zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    a 超链接标签
    select(下拉标签和textarea(文本框)
    input标签
    input 标签
    div 标签
    body 标签
    STL__网上资料
    STL_iterator返回值
    STL_算法_中使用的函数对象
    STL_std::iterator
  • 原文地址:https://www.cnblogs.com/Evence/p/4321869.html
Copyright © 2011-2022 走看看