[题解]2024CCPC重庆站-合成大西瓜

  • Sources:E - 合成大西瓜
  • Abstract:给定由 \(n\) 个点、\(m\) 条边构成的简单无向图( \(n\) 为奇数),每个点具有点权 \(a_i\)。将进行 \(\frac{n-1}{2}\) 次合并操作,最终图中仅剩 \(1\) 个点,求该点的最大点权。每次操作如下:
    • 选择三个不同的点 \(x,y,z\) ,当且仅当 \((x,y),(y,z)\)
    • 合并后的点为 \(w\) ,其点权 \(a_w=\max(a_y,\min(a_x,a_z))\)
    • 对于点 \(t\),当且仅当 \((t,x)\)\((t,y)\)\((t,z)\) ,建立 \((w,t)\)
    • 删除点 \(x,y,z\) 及某端为 \(x,y,z\) 的无向边。
  • Keywords:图论,贪心(签到题)
  • Solution:观察合并公式发现三点可组织为树形结构,\(y\) 为根节点,\(x,z\) 为叶子节点。为最大化最终点权,因此贪心:对于度为 \(1\) 的点,最终能保留的是次大值;度 \(\ge 2\) 的点,最终能保留的是最大值。
  • Code:
/*
 * Copyright (c) 2025 - Yerosius All Rights Reserved.
 * @Author: Yerosius
 * @Date: 2025-02-16 14:53:33
 * @FilePath: /VSCodeProject/E_合成大西瓜.cpp
 */
#include<bits/stdc++.h>

using namespace std;
using ll=long long;
#define int ll
#define endl "\n"
int n,m;
void solve(){
    vector<int>w(n+1),du(n+1);
    for(int i=1;i<=n;i++) cin>>w[i];
    while(m--){
        int a,b;cin>>a>>b;
        du[a]++,du[b]++;
    }
    int leafmax=0,leafans=0,notleaf=0;
    for(int i=1;i<=n;i++){
        if(du[i]==1){
            if(w[i]>leafmax) leafans=leafmax,leafmax=w[i];
            else leafans=max(leafans,w[i]);
        }else notleaf=max(notleaf,w[i]);
    }
    if(leafans==0) cout<<notleaf;
    else if(notleaf==0) cout<<leafans;
    else cout<<max(leafans,notleaf);
}
signed main(){
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    cin>>n>>m;
    solve();
    return 0;
}
posted @ 2025-02-16 19:14  椰萝Yerosius  阅读(141)  评论(0)    收藏  举报