CF1711B Party 图的性质
关键点就是节点的度。m为偶数时直接全部邀请,考虑m为奇数。
去掉一个度为奇的点或一对度均为偶数的点,均可以改变图的边的奇偶性。
为什么不去掉单个度为偶数的点?不改变边的奇偶性,更劣解。
因而对于去除离散的点的情况,去除单个为奇数的即是最优。
为什么不去掉更多?去掉更多以达到偶数边,意味更多人缺席,那一定不是更优解。
#include<iostream>
#include<algorithm>
#include<vector>
#include<map>
#define ll long long
#define pii pair<int, int>
using namespace std;
const int N = 1E5 + 10;
const int INF = 0x3f3f3f3f;
int n, m, u, v;
int a[N], d[N];
vector<pii> g;
int main(){
ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);
int t; cin >> t;
while(t--)
{
cin >> n >> m;
for(int i = 1 ; i <= n ; i++) {
cin >> a[i];
}
g.clear();
for(int i = 1 ; i <= n ; i++) {
d[i] = 0;
}
for(int i = 1 ; i <= m ; i++) {
cin >> u >> v;
d[u]++; d[v]++;
g.push_back({u, v});
}
if(m % 2 == 0) {
cout << 0 << endl;
continue;
}
int ans = INF;
// 去掉一个度为1的点,变奇为偶
for(int i = 1 ; i <= n ; i++) {
if(d[i] % 2 == 1) {
ans = min(ans, a[i]);
}
}
// 去掉一对度均为2的点,变奇为偶
for(auto pi : g) {
int u = pi.first, v = pi.second;
if(d[u] % 2 == 0 && d[v] % 2 == 0) {
ans = min(ans, a[u] + a[v]);
}
}
cout << ans << endl;
}
return 0;
}