白い牛5月23日G.木和ゲームオフ

リンク
問題の意味:
ツリーの各側に正の整数、整数nを有するこのエッジの色、右ツリー所定値チェーンツリーと代数鎖のこの側面にすべての色と呼ばれ
、全右ツリーは、異なる木のチェーンの全ての重みの代数和である
正確にすべてのエッジの色セット知ら \(1 \) \(N-1 \) この \(N-1 \)異なります正の整数は、それぞれの側一色を手配してくださいように、可能な限り小さく木重み得るために、この最小重みの
アイデア:
より大きな深さを設定し、そのエッジポイント \(X- \) \(X \)サブツリーサイズ \(SZ [X] \)鎖の数、片面 \(SZ [X] *(
N-SZ [X])\) 数以上の鎖に大きな割り当て小さい値
コード:

#include<bits/stdc++.h>
 
using namespace std;
 
const int N=1e5+5;
int n;
int cnt,to[N*2],nxt[N*2],head[N];
long long sz[N],tot[N];
 
void addedge(int a,int b) {
    cnt++;
    to[cnt]=b;
    nxt[cnt]=head[a];
    head[a]=cnt;
}
void dfs(int u,int pre) {
    sz[u]=1;
    for(int i=head[u];i;i=nxt[i]) {
        int v=to[i];
        if(v==pre) continue;
        dfs(v,u);
        sz[u]+=sz[v];
    }
    tot[u]=sz[u]*(n-sz[u]);
}
int main() {
    //freopen("in.txt","r",stdin);
    ios::sync_with_stdio(false);
    cin.tie(0);
    cin>>n;
    for(int i=1;i<n;i++) {
        int a,b;
        cin>>a>>b;
        addedge(a,b);
        addedge(b,a);
    }
    dfs(1,0);
    sort(tot+2,tot+1+n);
    long long ans=0;
    for(int i=2;i<=n;i++) ans+=tot[i]*(n-i+1);
    cout<<ans<<endl;
    return 0;
}

おすすめ

転載: www.cnblogs.com/c4Lnn/p/12549180.html