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

  • Sources:E - 合成大西瓜
  • Abstract:给定由 n 个点、m 条边构成的简单无向图( n 为奇数),每个点具有点权 ai。将进行 n12 次合并操作,最终图中仅剩 1 个点,求该点的最大点权。每次操作如下:
    • 选择三个不同的点 x,y,z ,当且仅当 (x,y),(y,z)
    • 合并后的点为 w ,其点权 aw=max(ay,min(ax,az))
    • 对于点 t,当且仅当 (t,x)(t,y)(t,z) ,建立 (w,t)
    • 删除点 x,y,z 及某端为 x,y,z 的无向边。
  • Keywords:图论,贪心(签到题)
  • Solution:观察合并公式发现三点可组织为树形结构,y 为根节点,x,z 为叶子节点。为最大化最终点权,因此贪心:对于度为 1 的点,最终能保留的是次大值;度 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 @   椰萝Yerosius  阅读(2)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
点击右上角即可分享
微信分享提示