P3237 [HNOI2014]米特運輸
阿新 • • 發佈:2020-08-21
顯然,對於一個點確定了,那麼整棵樹都確定了,因此我們列舉每個點作為不變點
之後用f[i]表示該節點固定時答案是多少,這樣就能跑出正確答案了
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=1e6+10; const int mod=1e7+7; const double eps=1e-6; int h[N],ne[N],e[N],idx; int w[N]; double f[N]; int in[N]; int a[N]; void add(int a,int b){ e[idx]View Code=b,ne[idx]=h[a],h[a]=idx++; } ll dfs(int u,int fa,double ans){ f[u]=ans+log(a[u]); in[u]--; int i; for(i=h[u];i!=-1;i=ne[i]){ int j=e[i]; if(j==fa) continue; dfs(j,u,ans+log(in[u])); } } int main(){ ios::sync_with_stdio(false); int n; cin>>n; int i; memset(h,-1,sizeof h); for(i=1;i<=n;i++){ cin>>a[i]; } for(i=1;i<n;i++){ int x,y; cin>>x>>y; add(x,y); add(y,x); in[x]++,in[y]++; } in[1]++; dfs(1,-1,0); sort(f+1,f+1+n);int mx=0; int cnt=1; for(i=2;i<=n;i++){ if(f[i]-f[i-1]<eps){ cnt++; } else{ mx=max(mx,cnt); cnt=1; } } cout<<n-mx<<endl; }