- 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;
}