PAT 1079. Total Sales of Supply Chain (25)

http://www.patest.cn/contests/pat-a-practise/1079

和1090一样的

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<math.h>
 4 #include<stdlib.h>
 5 
 6 #define MAXN 100010
 7 #define MAX(A, B) ((A) > (B) ? (A) : (B))
 8 
 9 int root;
10 int first[MAXN];
11 int next[MAXN];
12 int u[MAXN], v[MAXN];
13 int pro[MAXN];
14 int deep[MAXN];
15 
16 int queue[MAXN];
17 int front, rear;
18 
19 int bfs() {
20     memset(deep, 0, sizeof(deep));
21     front = rear = 0;
22     int max_deep = 0;
23     queue[rear++] = root;
24     while(front < rear) {
25         int u = queue[front++];
26         int e = first[u];
27         for (; e != -1; e = next[e]) {
28             deep[v[e]] = deep[u] + 1;
29             max_deep = MAX(max_deep, deep[v[e]]);
30             queue[rear++] = v[e];
31         }
32     }
33     return max_deep;
34 }
35 
36 int main() {
37     freopen("input", "r", stdin);
38     int n;
39     double p, r;
40     int i;
41     memset(first, 0xff, sizeof(first));
42     memset(pro, 0xff, sizeof(pro));
43     scanf("%d %lf %lf", &n, &p, &r);
44     int now_edge = 0;
45     for (i = 0; i < n; ++i) {
46         int k;
47         scanf("%d", &k);
48         if (0 == k) {
49             scanf("%d", pro + i);
50             continue;
51         }
52         int j;
53         for (j = 0; j < k; ++j) {
54             scanf("%d", v + now_edge);
55             u[now_edge] = i;
56             next[now_edge] = first[i];
57             first[i] = now_edge;
58             ++now_edge;
59         }
60     }
61     root = 0;
62     int max_deep = bfs();
63     double ans = 0;
64     for (int i = 0; i < n; ++i) {
65         if (pro[i] > 0) {
66             ans += pow(1.0 + r / 100, deep[i]) * p * pro[i];
67         }
68     }
69     printf("%.1lf\n", ans);
70     return 0;
71 }

 

posted @ 2015-07-29 17:45  ACSeed  Views(190)  Comments(0)    收藏  举报