玩家从n 个点n-1 条边的图,从节点1 丢下一个小球,小球将由于重力作用向下落,而
从小球所在点延伸出的每一条边有一个值pi 为小球通过该条边的概率(注意从同一个节点
向下延伸的所有边的pi 的和可以小于1,也可以大于1,并且保证对于单独的一条边不会出
现pi>1 的情况),而对于所有处于最下方的节点(如图红点所示)都可以有一个值vi,代
表玩家可以获得的奖励。现在老板给你这样一张图,之后给你n 个vi 的值,老板希望玩家
可以获得的奖励的期望值最小。(对题目不理解可以参见样例)
Ps:小球不会逆着重力往回滚QAQ。保证所给出的图无重边。
★数据输入
输入第一行为一个正整数N (2 < N < 10000), 表示有n 个节点,编号为1 到N。
接下来N-1 行,每行三个整数a b pi ,表示从a,b 之间有一条路径,经过这条路径的
可能性为pi。
接下来一行为有n 个整数,表示n 个vi 的值(10000>=vi>0)。
★数据输出

输入第一行为一个正整数N (2 < N < 10000), 表示有n 个节点,编号为1 到N。
接下来N-1 行,每行三个整数a b pi ,表示从a,b 之间有一条路径,经过这条路径的
可能性为pi。
接下来一行为有n 个整数,表示n 个vi 的值(10000>=vi>0)。
★数据输出
对于每个询问,输出一行一个数精度要求为.10lf,表示最小的奖励期望值。
输入示例输出示例
7

1 2 0.8
1 3 0.2
2 4 1.0
4 7 1.0
3 5 0.7
3 6 0.3
1 2 3 4 5 6 7
1.2600000000

 

表示题目看了好久才懂~(最后的n个vi值不一定全部需要用到,根据建立的二叉树,才能确定需要用到多少个)

开始没弄懂父节点数组表示法,按照自己的思路做,写了一个好搞笑的代码,然后又尝试用孩子链表表示法做还是行不通,然后又认真研究了一下父节点数组表示法,看到这个代码,顿时豁然开朗:

  1 #include <iostream>
  2 using namespace std;
  3 
  4 #define MAX_TREE_SIZE 100
  5 typedef struct     //节点结构
  6 {
  7     char data;
  8     int parent;        //双亲位置域
  9 }PTNode;
 10 
 11 typedef struct        //树结构
 12 {
 13     PTNode node[MAX_TREE_SIZE];
 14     int count;        //根的位置和节点个数
 15 }PTree;
 16 
 17 //初始化树
 18 void init_ptree(PTree &tree)
 19 {
 20     tree.count=-1;
 21 }
 22 //添加节点
 23 void add_ptnode(PTree &tree, PTNode ptnode)
 24 {
 25     tree.count++;
 26     tree.node[tree.count].data = ptnode.data;
 27     tree.node[tree.count].parent = ptnode.parent;
 28 }
 29 //输出树
 30 void print_ptree(PTree &tree)
 31 {
 32     int i;
 33     for(i=0;i<=tree.count;i++)
 34     {
 35         cout<<"   "<<i<<"        "<<tree.node[i].data<<"        "<<tree.node[i].parent<<endl;
 36     }
 37 }
 38 //前序遍历
 39 void PreOrder(PTree &tree , int num)
 40 {
 41     for(int i=num; i<=tree.count; i++)
 42     {
 43            if(i == num)
 44            {
 45                 cout<<"   "<<i<<"        "<<tree.node[i].data<<"        "<<tree.node[i].parent<<endl;
 46                 for(int j=num+1 ; j<=tree.count; j++)
 47                 {
 48                      if(tree.node[j].parent == i)
 49                      {
 50                         PreOrder(tree , j);
 51                      }
 52                 }
 53            }
 54     }
 55 }//PreOrder
 56 //树没有中序遍历
 57 //后序遍历
 58 void BackOrder(PTree &tree , int num)
 59 {
 60     for(int i=num; i<=tree.count; i++)
 61     {
 62            if(i == num)
 63            {
 64                 for(int j=num+1 ; j<=tree.count; j++)
 65                 {
 66                      if(tree.node[j].parent == i)
 67                      {
 68                         BackOrder(tree , j);
 69                      }
 70                 }
 71                 cout<<"   "<<i<<"        "<<tree.node[i].data<<"        "<<tree.node[i].parent<<endl;
 72                 
 73            }
 74     }
 75 }//BackOrder
 76 
 77 int main()
 78 {
 79     FILE *fin=fopen("树的表示法.txt","r");
 80 
 81     PTree ptree;
 82     init_ptree(ptree);
 83     PTNode ptnode;
 84 
 85     while(fscanf(fin,"%c%d",&ptnode.data,&ptnode.parent)!=EOF)
 86     {
 87         add_ptnode(ptree,ptnode);
 88         fscanf(fin,"%c%d",&ptnode.data,&ptnode.parent);
 89     }
 90     //输出树
 91     cout<<"数组下标  节点值  双亲位置"<<endl;
 92     print_ptree(ptree);
 93 
 94 
 95     //前序遍历
 96     //cout<<endl;
 97     //PreOrder(ptree,0);
 98 
 99     //后序遍历
100     //cout<<endl;
101     //BackOrder(ptree,0);
102 
103     fclose(fin);
104     return 0;
105 }
View Code

相关文章:

  • 2021-10-04
  • 2021-06-15
  • 2021-06-23
  • 2021-05-17
  • 2021-05-19
  • 2022-02-19
  • 2021-10-15
  • 2021-08-09
猜你喜欢
  • 2021-07-14
  • 2021-08-28
  • 2021-10-04
  • 2021-05-16
  • 2022-02-05
  • 2021-06-24
相关资源
相似解决方案