CF1711B Party 图的性质

发布时间 2023-07-04 14:25:17作者: LegendN

关键点就是节点的度。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;
}