D e s c r i p t i o n Description Description
现有一张 n n n点, m m m条边的无向图,求使得所有点的度数不小于 k k k的最小添加边数(可以重边,但不能自环)
对于60%的数据,
n
×
a
n
s
≤
10000000
n × ans ≤ 10000000
n×ans≤10000000,
a
n
s
ans
ans表示最终的答案。
对于前100%的数据,
n
,
m
,
k
≤
100000
,
n
≥
2
,
m
,
k
≥
0
,
x
≠
y
,
1
≤
x
,
y
≤
n
n, m, k ≤ 100000,n ≥ 2, m, k ≥ 0, x ≠ y, 1 ≤ x, y ≤ n
n,m,k≤100000,n≥2,m,k≥0,x̸=y,1≤x,y≤n
S o l u t i o n Solution Solution
求出所有点需要的度数记为 a i a_i ai
若有一个点
k
k
k,满足
a
k
>
∑
a
−
k
a_k>\sum a -k
ak>∑a−k,则答案就是
a
k
a_k
ak
否则答案即为
⌈
∑
a
2
⌉
\lceil \frac{\sum a}{2}\rceil
⌈2∑a⌉
C o d e Code Code
#include<algorithm>
#include<cstdio>
using namespace std;int n,m,k,x,y,t;
long long ans,sum,ds[100001];
signed main()
{
scanf("%d %d %d",&n,&m,&k);
for(register int i=1;i<=m;i++)
{
scanf("%d%d",&x,&y);
ds[x]++;ds[y]++;
}
for(register int i=1;i<=n;i++) if(ds[i]<k) sum+=k-ds[i];
for(register int i=1;i<=n;i++) if(k-ds[i]>=sum-k+ds[i]) {ans=(long long)k-ds[i];break;}
if(!ans) ans=(sum+1)>>1;
printf("%lld",ans);
}