2023四川省程序设计大赛补题

​​​​​​​F. 自建一始 - 2023 年(第十五届)四川省大学生程序设计大赛重现赛 - ECNU Online Judge

首先是二分答案。

check函数里,如果更新操作后,会有连锁反应,所以需要继续检查加边,最后检查是否是完全图。

#include <bits/stdc++.h>
using namespace std;
vector<vector<int>> g(550,vector<int>(550));
vector<int> deg(550);
int n, m;
bool check(int x){
    auto gg = g;
    auto du = deg;
    while(1){
        bool flag = false;
        for(int i = 1 ; i <= n ; i ++){
            for(int j = 1 ; j <= n ; j ++){
                if(i == j) continue;
                if(du[i] + du[j] >= x && !gg[i][j]){
                    gg[i][j] = gg[j][i] = 1;
                    du[i]++;
                    du[j]++;
                    flag = true;
                }
            }
        }
        if(!flag) break;
    }
    for(int i = 1 ; i <= n ; i ++){
        if(du[i] != n - 1) return false;
    }
    return true;
}
void solve(){
    cin >> n >> m;
    for(int i = 0 ; i < m ; i ++){
        int x, y;
        cin >> x >> y;
        deg[x]++;
        deg[y]++;
        g[x][y] = g[y][x] = 1;
    }

    int l = 0 , r = 2 * (n - 1);
    while(l < r){
        int mid = (l + r + 1) >> 1;
        //cout << mid;
        if(check(mid)) l = mid;
        else r = mid - 1;
    }
    cout << l << endl;
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    int _ = 1;
    while(_--) solve();
    return 0;
}

posted @ 2023-12-05 23:45  xde_yt  阅读(16)  评论(0编辑  收藏  举报  来源