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