米特运输
精度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 }