当前位置:   article > 正文

PTA-算法笔记之树的遍历(BFS+DFS)_pta 先序遍历 李曲dfs

pta 先序遍历 李曲dfs

题目 A1079 Total Sales of Supply Chain

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int N;
  4. double P,R;
  5. double res = 0;
  6. struct node{
  7. double data;//货物量
  8. vector<int> child;
  9. }Node[100110];
  10. void DFS(int index,int depth)
  11. {
  12. //递归边界
  13. if(Node[index].child.size() == 0)
  14. {
  15. res += Node[index].data*pow(1+R,depth);
  16. return;
  17. }
  18. //递归式
  19. for(int i=0;i<Node[index].child.size();i++)
  20. {
  21. DFS(Node[index].child[i],depth+1);
  22. }
  23. }
  24. void BFS(int index)
  25. {
  26. queue<int> q;
  27. q.push(index);
  28. int height = 0;
  29. while(!q.empty())
  30. {
  31. int n = q.size();
  32. for(int i=0;i<n;i++)
  33. {
  34. int temp = q.front();
  35. q.pop();
  36. if(Node[temp].child.size()==0)
  37. {
  38. res += Node[temp].data*pow(1+R,height);
  39. }
  40. for(int i=0;i<Node[temp].child.size();i++)
  41. {
  42. q.push(Node[temp].child[i]);
  43. }
  44. }
  45. height++;
  46. }
  47. }
  48. int main()
  49. {
  50. cin>>N>>P>>R;
  51. R/=100;
  52. for(int i=0;i<N;i++)
  53. {
  54. int num;
  55. cin>>num;
  56. if(num==0)
  57. {
  58. cin>>Node[i].data;
  59. }
  60. else
  61. {
  62. for(int j=0;j<num;j++)
  63. {
  64. int x;
  65. cin>>x;
  66. Node[i].child.push_back(x);
  67. }
  68. }
  69. }
  70. BFS(0);
  71. printf("%.1lf",P*res);
  72. return 0;
  73. }

A1090 Highest Price in Supply Chain (25分)

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int maxn = 100010;
  4. vector<int> child[maxn];
  5. int n;
  6. double p,r;
  7. double res = 0;
  8. int maxDepth = 0,num=0;
  9. void DFS(int index,int depth)
  10. {
  11. if(child[index].size()==0)
  12. {
  13. if(depth>maxDepth)
  14. {
  15. maxDepth = depth;
  16. num = 1;
  17. }
  18. else if(depth == maxDepth)
  19. {
  20. num++;
  21. }
  22. return;
  23. }
  24. for(int i=0;i<child[index].size();i++)
  25. {
  26. DFS(child[index][i],depth+1);
  27. }
  28. }
  29. void BFS(int index)
  30. {
  31. queue<int> q;
  32. q.push(index);
  33. while(!q.empty())
  34. {
  35. int n = q.size();
  36. //每一次for循环就是层序遍历的一行
  37. for(int i=0;i<n;i++)
  38. {
  39. int temp = q.front();
  40. q.pop();
  41. for(int j=0;j<child[temp].size();j++)
  42. {
  43. q.push(child[temp][j]);
  44. }
  45. }
  46. maxDepth++;
  47. num = n;
  48. }
  49. maxDepth = maxDepth - 1;
  50. }
  51. int main()
  52. {
  53. cin>>n>>p>>r;
  54. r/=100;
  55. int x,root;
  56. for(int i=0;i<n;i++)
  57. {
  58. cin>>x;
  59. if(x==-1)
  60. {
  61. root = i;
  62. }
  63. else
  64. {
  65. child[x].push_back(i);
  66. }
  67. }
  68. BFS(root);
  69. printf("%.2lf %d\n",p*pow(1+r,maxDepth),num);
  70. return 0;
  71. }

A1094 The Largest Generation (25分)

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int maxn = 101;
  4. int hashTable[maxn] = {0};
  5. int n,m;
  6. vector<int> child[maxn];
  7. void DFS(int index,int level)
  8. {
  9. hashTable[level]++;
  10. for(int i=0;i<child[index].size();i++)
  11. {
  12. DFS(child[index][i],level+1);
  13. }
  14. }
  15. void BFS(int index,int level)
  16. {
  17. queue<int> q;
  18. q.push(index);
  19. while(!q.empty())
  20. {
  21. int nsize = q.size();
  22. //每一次for循环就代表是层序遍历的一行
  23. for(int i=0;i<nsize;i++)
  24. {
  25. int temp = q.front();
  26. hashTable[level]++;
  27. q.pop();
  28. for(int j=0;j<child[temp].size();j++)
  29. {
  30. q.push(child[temp][j]);
  31. }
  32. }
  33. level++;
  34. }
  35. }
  36. int main()
  37. {
  38. cin>>n>>m;
  39. for(int i=0;i<m;i++)
  40. {
  41. int id,k;
  42. cin>>id>>k;
  43. for(int j=0;j<k;j++)
  44. {
  45. int x;
  46. cin>>x;
  47. child[id].push_back(x);
  48. }
  49. }
  50. BFS(1,1);
  51. int maxLevel = -1,maxNum = 0;
  52. for(int i=1;i<maxn;i++)
  53. {
  54. if(hashTable[i]>maxNum)
  55. {
  56. maxNum = hashTable[i];
  57. maxLevel = i;
  58. }
  59. }
  60. cout<<maxNum<<" "<<maxLevel<<endl;
  61. return 0;
  62. }

A1106 Lowest Price in Supply Chain (25分)

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. struct node
  4. {
  5. vector<int> child;
  6. };
  7. int n;
  8. double p,r;
  9. vector<node> v;
  10. int num=0,minDepth=INT_MAX;
  11. void DFS(int index,int depth)
  12. {
  13. if(v[index].child.size()==0) //到达叶子结点
  14. {
  15. if(depth<minDepth)
  16. {
  17. minDepth = depth;
  18. num = 1;
  19. }
  20. else if(depth==minDepth)
  21. {
  22. num++;
  23. }
  24. return;
  25. }
  26. for(int i=0; i < v[index].child.size(); i++)
  27. {
  28. DFS(v[index].child[i],depth+1); //递归访问子节点
  29. }
  30. }
  31. int main()
  32. {
  33. int k,child;
  34. cin>>n>>p>>r;
  35. v.resize(n);
  36. r /= 100;
  37. for(int i=0;i<n;i++)
  38. {
  39. cin>>k;
  40. if(k!=0) //不是叶结点
  41. {
  42. for(int j=0;j<k;j++)
  43. {
  44. int x;
  45. cin>>x;
  46. v[i].child.push_back(x);
  47. }
  48. }
  49. }
  50. DFS(0,0); //DFS入口
  51. printf("%.4f %d\n", p*pow(1+r,minDepth),num);
  52. return 0;
  53. }

A1004 Counting Leaves (30分)

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int maxn = 101;
  4. int hashTable[maxn] = {0};
  5. int n,m;
  6. int level = 1;
  7. vector<int> child[maxn];
  8. void DFS(int index,int depth)
  9. {
  10. if(child[index].size()==0)
  11. {
  12. hashTable[depth]++;
  13. level = max(depth,level);
  14. return;
  15. }
  16. for(int i=0;i<child[index].size();i++)
  17. {
  18. DFS(child[index][i],depth+1);
  19. }
  20. }
  21. void BFS(int index)
  22. {
  23. queue<int> q;
  24. q.push(index);
  25. while(!q.empty())
  26. {
  27. int nsize = q.size();
  28. for(int i=0;i<nsize;i++)
  29. {
  30. int temp = q.front();
  31. if(child[temp].size()==0)
  32. {
  33. hashTable[level]++;
  34. }
  35. q.pop();
  36. for(int j=0;j<child[temp].size();j++)
  37. {
  38. q.push(child[temp][j]);
  39. }
  40. }
  41. level++;
  42. }
  43. level-=1;//最后会多加一行删掉
  44. }
  45. int main()
  46. {
  47. cin>>n>>m;
  48. for(int i=0;i<m;i++)
  49. {
  50. int id,k;
  51. cin>>id>>k;
  52. for(int j=0;j<k;j++)
  53. {
  54. int x;
  55. cin>>x;
  56. child[id].push_back(x);
  57. }
  58. }
  59. // DFS(1,1);
  60. BFS(1);
  61. int maxLevel = -1,maxNum = 0;
  62. for(int i=1;i<=level;i++)
  63. {
  64. cout<<hashTable[i];
  65. if(i!=level)
  66. cout<<" ";
  67. }
  68. return 0;
  69. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/681792
推荐阅读
相关标签
  

闽ICP备14008679号