米特运输

精度BOOM,然而可以用对数的性质把乘法罗成加法

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 
 4 #define esp 1e-6
 5 #define inf 0x3f3f3f3f
 6 #define maxn 500005
 7 int cnt,v[maxn<<1],next[maxn<<1],first[maxn];
 8 int du[maxn],q[maxn];
 9 double a[maxn],dist[maxn];
10 
11 void add(int st,int end){
12     v[++cnt]=end;
13     next[cnt]=first[st];
14     first[st]=cnt;
15 }
16 void bfs(){
17     int head=0,tail=0;
18     q[++tail]=1;
19     while(head<tail){
20         int x=q[++head];
21         double tmp=log(du[x]);
22         for(int e=first[x];e;e=next[e]){
23             dist[v[e]]=dist[x]+tmp;
24             q[++tail]=v[e];
25         }
26     }
27 }
28 int main(){
29     int n;
30     scanf("%d",&n);
31     for(int i=1;i<=n;i++){
32         scanf("%lf",&a[i]);
33         a[i]=log(a[i]);
34     }
35     for(int i=1;i<n;i++){
36         int x,y;
37         scanf("%d%d",&x,&y);
38         add(x,y),du[x]++;
39     }
40     bfs();
41     for(int i=1;i<=n;i++)
42         a[i]+=dist[i];
43     sort(a+1,a+1+n);
44     int ans=inf,sum=1;
45     for(int i=2;i<=n;i++){
46         if(a[i]-a[i-1]<esp)sum++;
47         else {
48             ans=min(ans,n-sum);
49             sum=1;
50         }
51     }
52     ans=min(ans,n-sum);
53     printf("%d\n",ans);
54     return 0;
55 }
View Code

 

posted @ 2016-01-04 16:42  Ngshily  阅读(151)  评论(0编辑  收藏  举报