1. 程式人生 > 實用技巧 >P3237 [HNOI2014]米特運輸

P3237 [HNOI2014]米特運輸

顯然,對於一個點確定了,那麼整棵樹都確定了,因此我們列舉每個點作為不變點

之後用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]
=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; }
View Code